[英]OpenCV Template Matching Wrong Match Score / Area
對於在Java中使用TM_CCOEFF_NORMED
進行模板匹配的即時TM_CCOEFF_NORMED
,直到現在我一直都得到非常准確和有意義的結果,但是使用此特定模板圖像時,我的匹配分數不正確。 模板圖像並非故意屬於輸入(源)圖像,因此Im期望匹配分數不好,最差,但它給了我最好的; “ 1.0”,並始終在左上角的同一位置找到模板圖像。
這是我的模板圖片:
輸出帶有紅色雲輸入圖像的示例:(根據程序,綠色突出顯示是最佳匹配)
帶有黑暗城市輸入圖像的示例輸出:
MinMaxLocResult mmr = Core.minMaxLoc(result);
matchScore = mmr.maxVal;
對於特定的淺綠色模板圖像, matchScore
變量始終為1.0,盡管紅色和深色圖像與綠色完全不相似。 我很高興收到您的改進建議和建議,因為TM_CCOEFF_NORMED
始終將第一個搜索到的正方形/矩形作為最佳匹配,得分為1.0,這不能正確,另一方面,我也嘗試過TM_CCORR_NORMED
和TM_SQDIFF_NORMED
他們給出了不同的匹配分數,這很有前途,但TM_CCORR_NORMED
仍然TM_CCORR_NORMED
了不錯的匹配分數,這在我看來仍然是意料之外的。 如果有人可以向我解釋匹配方法之間的區別,或者提供一個鏈接到已經討論這些方法的現有頁面,我會很高興。在opencv docs / tutorials上,只有可用的公式,而沒有詳細的解釋。 最后,我想知道何時對哪種類型的圖像使用哪種匹配方法以獲得最佳效果。
這是更多代碼:
Mat img = Highgui.imread(inFile);
Mat templ = Highgui.imread(templateFile);
// / Create the result matrix
int result_cols = img.cols() - templ.cols() + 1;
int result_rows = img.rows() - templ.rows() + 1;
Mat result = new Mat(result_rows, result_cols, CvType.CV_32FC1);
// / Do the Matching
Imgproc.matchTemplate(img, templ, result, match_method);
// / Localizing the best match with minMaxLoc
MinMaxLocResult mmr = Core.minMaxLoc(result);
這是行不通的,因為當圖片以灰度轉換時,它們看起來可能很相似。
cv :: minMaxLoc在這種情況下不起作用。
您應該使用其他東西,例如特征提取器或邊緣檢測器,並使用度量值(例如馬氏距離)進行比較
對於SQDIFF和SQDIFF_NORMED,最佳匹配是較低的值,而對於其他方法,較高的是最佳匹配。
建議:在找到最大或最小位置之前對結果圖像進行歸一化
希望這可以幫助。
我也有同樣的問題。 看來模板不能是純色(所有像素都具有相同的值)。 如果模板的值相同,則結果的分數必須為1( TM_CCOEFF_NORMED
)。 也許您可以將模板匹配的方法更改為TM_CcorrNormed
MinMaxLocResult mmr = Core.minMaxLoc(result);
無論正確與否,該方法都會為您提供最佳匹配結果。因此,根據我的經驗,我使用了兩個循環來找到最佳匹配結果。
int threshold = 0.95; // for TM_CCOEFF_NORMED and TM_CCORR_NORMED
List<Rect> recognizedRects;
List<double> recognizedScores;
for(int i=0;i<result.height;i++) {
for(int j=0;j<result.width;j++) {
if(result.data[i,j,0] > threshold) {
recognizedRects.add(new Rectangle(j,i,template.width,template.height);
recognizedScores.add(result.data[i,j,0])
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.