2013-01-14 112 views
3

只是想清除我的困惑。我測試了openCV模板匹配方法來匹配一些數字。首先我有這個數字序列0 1 2 3 4 5 1 2 3 4 5(在二進制化之後,字符寬度可能不同)。模板匹配如何工作以匹配數字「1」?可以;瞭解openCV中的模板匹配

  1. 滑動通過所有的窗口,直到它發現2個匹配(2輸出),或
  2. 停止後它匹配第一「1」,或
  3. 找到兩個數之間的相關性最高「1」並選擇其中一個。

Matching Number '1'

編輯:由於附着是輸出。它只匹配一個數字'1'而不是兩個'1'。

[問]我怎樣才能同時檢測兩個數字'1'?

+0

你應該用Google多一點.. .http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matchi ng/template_matching.html –

+0

是的,我在閱讀之前將其發佈在此處。但是,當我試着對我的例子只選擇一個數字來匹配。 – Mzk

+0

您正在使用哪種匹配方法?相關性?嘗試CV_TM_SQDIFF –

回答

5

我知道這是一個老問題,但這裏是一個答案。

當你做MatchTemplate時,它會輸出一個灰度圖像。之後,你需要在上面做一個MinMax。然後,您可以檢查您正在查找的範圍內是否有結果。在下面的例子中,使用EmguCV(C#中的OpenCV封裝),我只在最低查找(minValues數組的索引0)周圍畫一個矩形,當它低於0.75時(您可以根據需要調整此閾值)。

下面是代碼:

Image<Gray, float> result = new Image<Gray, float>(new System.Drawing.Size(nWidth, nHeight)); 
result = image.CurrentImage.MatchTemplate(_imageTemplate.CurrentImage, Emgu.CV.CvEnum.TM_TYPE.CV_TM_SQDIFF_NORMED); 


double[] minValues; 
double[] maxValues; 
System.Drawing.Point[] minLocations; 
System.Drawing.Point[] maxLocations; 

result.MinMax(out minValues, out maxValues, out minLocations, out maxLocations); 
if (minValues[0] < 0.75) 
{ 
    Rectangle rect = new Rectangle(new Point(minLocations[0].X, minLocations[0].Y), 
     new Size(_imageTemplate.CurrentImage.Width, _imageTemplate.CurrentImage.Height)); 
    image.CurrentImage.Draw(rect, new Bgr(0,0,255), 1); 
} 
else 
{ 
    //Nothing has been found 
} 

編輯

下面是輸出的一個例子:

Example of output

+0

你可以粘貼你做的一些圖像嗎? – Mzk

+0

我將在下週編輯我的答案,當我將代碼與我 –

+0

感謝首先@讓。=) – Mzk