2013-02-11 153 views
0

我對某些項目使用opencv。並有一個應該解決的任務。 任務很簡單。我有一個主要的圖片,並有一個模板比我比較主要的圖片和模板。我使用matchTemplate()函數。我只是對一時的好奇心。 在文檔中,我發現了以下信息: 要標識匹配區域,我們必須通過滑動來比較模板圖像和源圖像。 通過滑動,我們的意思是一次將貼片移動一個像素(從左到右,從上到下)。在每個位置,都會計算度量標準,以表示該位置匹配的「好」或「差」(或者該補丁與源圖像的特定區域有多相似)。 對於T上I的每個位置,將度量值存儲在結果矩陣(R)中。 R中的每個位置都包含匹配度量。opencv,模板匹配

因此,例如,您有主圖片和模板。你知道,至少在主圖中有一個模板條目。它工作正常。但是,如果您不知道主圖片0或10中有多少個模板?有什麼辦法來計算它?應該使用哪種算法?我如何理解結果矩陣中的指標是什麼意思? 在此先感謝。

回答

1

matchTemplate()函數創建一個新的矩陣,其中每個像素都保存給定模板在該點與圖像匹配的值。爲了檢測與模板匹配的所有區域,您需要檢查結果矩陣,並檢查每個像素是否通過了某個閾值。
如果一個像素通過閾值,這意味着它是圖像中與模板匹配的區域的左上角。一個簡單的實現可能是這樣的:

double PATT_THRESH = 0.4 
IplImage *result = cvCreateImage(cvSize(imageW, imageH), IPL_DEPTH_32F, 1); 
vector<CvPoint> foundTemplates; 
cvMatchTemplate(image, pattern, result, CV_TM_SQDIFF_NORMED); 
for (int i = 0 ; i < result->width ; ++i) { 
    for (int j = 0 ; j < result->height ; ++j) { 
     if (cvGet2D(result, j, i).val[0] < PATT_THRESH) { 
      foundTemplates.push_back(cvPoint(i, j); 
     } 
    } 

} 

我不知道你用的是什麼語言,但它很容易翻譯成其他語言。希望有所幫助。