正常模板匹配函數
matchTemplate(img, templatee, resultMat, 0);//模板匹配
?這里0代表的是方法,一般默認為0就ok?
img是輸入圖像 templatee是模板 resultmat是輸出
1、cv::TM_SQDIFF:該方法使用平方差進行匹配,因此最佳的匹配結果在結果為0處,值越大匹配結果越差。2、cv::TM_SQDIFF_NORMED:該方法使用歸一化的平方差進行匹配,最佳匹配也在結果為0處。3、cv::TM_CCORR:相關性匹配方法,該方法使用源圖像與模板圖像的卷積結果進行匹配,因此,最佳匹配位置在值最大處,值越小匹配結果越差。4、cv::TM_CCORR_NORMED:歸一化的相關性匹配方法,與相關性匹配方法類似,最佳匹配位置也是在值最大處。5、cv::TM_CCOEFF:相關性系數匹配方法,該方法使用源圖像與其均值的差、模板與其均值的差二者之間的相關性進行匹配,最佳匹配結果在值等于1處,最差匹配結果在值等于-1處,值等于0直接表示二者不相關。6、cv::TM_CCOEFF_NORMED:歸一化的相關性系數匹配方法,正值表示匹配的結果較好,負值則表示匹配的效果較差,也是值越大,匹配效果也好。
對于輸出的說明:
就是說result圖像中的每一個點的值代表了一次相似度比較結果。
?如圖可知,模板在待測圖像上每次在橫向或是縱向上移動一個像素,并作一次比較計算,由此,橫向比較W-w+1次,縱向比較H-h+1次,從而得到一個(W-w+1)×(H-h+1)維的結果矩陣,result即是用圖像來表示這樣的矩陣,因而圖像result的大小為(W-w+1)×(H-h+1)。匹配結果圖像與原圖像之間的大小關系,他們之間差了一個模板大小。
對輸出值的歸一化
?
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());matchLoc = minLoc;
?我們這里選擇了最小值的位置,因為我們選的第一種方法也就是值越小越好,其他方法有可能是選最大的位置!!
在圖像畫出匹配最佳:
?
Mat dispmat;img.copyTo(dispmat);rectangle(dispmat, matchLoc, Point(matchLoc.x + templatee.cols, matchLoc.y + templatee.rows),CV_RGB(0,255,0), 2, 8, 0);imshow("dispmat", dispmat);waitKey(0);destroyAllWindows();
結果顯示
利用opencv自帶選取roi+模板匹配,進行簡單的人臉追蹤識別?
選取roi
if (cnt == 0) {Rect2d r;r = selectROI(frame, true);tempMat = frame(r);tempMat.copyTo(refMat);destroyAllWindows();}
?完整代碼:
?
VideoCapture cap(0);Mat frame;Mat tempMat;Mat refMat;Mat dispMat;Mat resultMat;int cnt = 0;while (1) {cap >> frame;if (cnt == 0) {Rect2d r;r = selectROI(frame, true);tempMat = frame(r);tempMat.copyTo(refMat);destroyAllWindows();}imshow("template", refMat);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());if (match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED){matchLoc = minLoc;}else{matchLoc = 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);
至此opencv基礎學習到此結束 后期學習一些進階自學內容。
************************************************----***********************************************************