模板匹配:在一幅圖像中尋找和模板圖像最相似的區域。
原理:遍歷圖像中的每一個可能的位置,比較各處與模板是否“相似”,當相似度足夠高時,就認為找到了目標。
OpenCV提供了6種模板匹配算法:
1、平方差匹配法CV_TM_SQDIF,最好的匹配值為0;匹配越差,匹配值越大。
2、歸一化平方差匹配法CV_TM_SQDIFF_NORMED
3、相關匹配法CV_TM_CCOR,數值越大表明匹配程度越好。4、歸一化相關匹配法CV_TM_CCORR_NORMED
5、相關系數匹配法CV_TM_CCOEFF,1表示完美的匹配;-1表示最差的匹配。
6、歸一化相關系數匹配法 CV_TM_CCOEFF_NORMED
函數通過在輸入圖像image中滑動(從左到右,從上到下),尋找各個位置的區塊(搜索窗口)與模板圖像templ的相似度,並將結果保存在結果圖像result中。該圖像中的每一個點的亮度表示該處的輸入圖像與模板圖像的匹配程度,然后可以通過某方法(一般使用函數cvMinMaxLoc)定位result中的最大值或者最小值得到最佳匹配點,最后根據匹配點和模板圖像的矩形框標出匹配區域。
圖像示例:
模板匹配:
1 // 一幅圖像的模板匹配,找到在原圖中的大致位置 2 void Match_Template(IplImage *src, IplImage *templat, IplImage *show) 3 { 4 IplImage *result; 5 int srcW, templatW, srcH, templatH, resultW, resultH; 6 if(!src || !templat) { 7 printf("打開圖片失敗"); 8 return; 9 } 10 srcW = src->width; 11 srcH = src->height; 12 templatW = templat->width; 13 templatH = templat->height; 14 15 if(srcW < templatW || srcH < templatH) { 16 printf("模板不能比原圖小"); 17 return; 18 } 19 //計算結果矩陣的大小 20 resultW = srcW - templatW + 1; 21 resultH = srcH - templatH + 1; 22 //創建存放結果的空間 23 result = cvCreateImage(cvSize(resultW,resultH),32,1); 24 double minVal,maxVal; 25 CvPoint minLoc,maxLoc; 26 //調用模板匹配函數--平方差匹配 27 cvMatchTemplate(src,templat,result,CV_TM_SQDIFF); 28 //查找最相似的值及其所在坐標 29 cvMinMaxLoc(result,&minVal,&maxVal,&minLoc,&maxLoc,NULL); 30 printf("minVal = %f maxVal = %f\n ",minVal,maxVal); 31 //繪制結果 32 cvRectangle(show,minLoc,cvPoint(minLoc.x+templat->width,minLoc.y+templat->height),CV_RGB(255,255,255),5); 33 34 //顯示結果 35 cvNamedWindow("show"); 36 cvNamedWindow("tem"); 37 cvShowImage("show",show); 38 cvShowImage("tem" , templat); 39 cvWaitKey(0); 40 }
2021-06-04