matchTemplate函數參數
模板匹配是通過模板在采集到的原圖像進行滑動尋找與模板圖像相似的目標。模板匹配不是基于直方圖的方式,而是基于圖像的灰度匹配。
6種匹配度量方法:
平方差匹配法CV_TM_SQDIFF
歸一化平方差匹配法CV_TM_SQDIFF_NORMED
相關匹配法CV_TM_CCORR
歸一化相關匹配法CV_TM_CCORR_NORMED
系數匹配法CV_TM_CCOEFF
化相關系數匹配法CV_TMCCOEFF_NORMED
方差匹配方法:完全匹配會得到1, 完全不匹配會得到0。
歸一化方差匹配方法:完全匹配結果為0。
相關性匹配方法:完全匹配會得到很大值,不匹配會得到一個很小值或0。
歸一化的互相關匹配方法:完全匹配會得到1, 完全不匹配會得到0。
相關系數匹配方法:完全匹配會得到一個很大值,完全不匹配會得到0,完全負相關會得到很大的負數。
歸一化的相關系數匹配方法:完全匹配會得到1,完全負相關匹配會得到-1,完全不匹配會得到0。
關于函數中result矩陣的含義,這篇文章有總結,有疑問的可以看一看:
cvMatchTemplate中的參數"result"的幾點說明
matchTemplateDemo代碼
框選出模板后,按下回車鍵即可
int main()
{//改變控制臺字體顏色system("color 02");VideoCapture capture(0);int cnt = 0;Mat frame; //存儲每一幀的圖像Mat tempMat;Mat refMat;Mat resultMat;Mat dispMat;while (1){capture >> frame; //讀取當前幀if (cnt == 0) {Rect2d r;r = selectROI(frame, true); //選擇一個矩形roi區域tempMat = frame(r); //此區域為模板區域tempMat.copyTo(refMat);destroyAllWindows();}int match_method = 0; //選取平方差匹配法 matchTemplate(frame, refMat, resultMat, match_method);normalize(resultMat, resultMat, 0,1,NORM_MINMAX,-1,Mat()); //歸一化double minVal; double maxVal; Point minLoc; Point maxLoc; Point matchLoc; //定義最大值最小值以及它們的位置變量minMaxLoc(resultMat, &minVal, &maxVal, &minLoc, &maxLoc,Mat()); //從結果矩陣中找到匹配度最大以及最小的值并且確定其位置//對于方法SQDIFF和SQDIFF_NORMED兩種方法來講,越小的值就有著更高的匹配結果//而其余的方法則是數值越大匹配效果越好if (match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED)matchLoc = minLoc;elsematchLoc = maxLoc;frame.copyTo(dispMat);//以最佳匹配點為中心繪制與模板相同大小的框rectangle(dispMat, matchLoc, Point(matchLoc.x + refMat.cols, matchLoc.y + refMat.rows), Scalar::all(0), 2, 8, 0);cnt++;imshow("template",refMat) ;imshow("dispMat",dispMat) ;waitKey(30);}return 0;
}
展示效果
這并不是演示代碼的展示效果,但是差不多意思。