簡體   English   中英

OpenCV模板匹配錯誤匹配分數/區域

[英]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_NORMEDTM_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM