模板匹配:在一幅图像中寻找和模板图像最相似的区域。
原理:遍历图像中的每一个可能的位置,比较各处与模板是否“相似”,当相似度足够高时,就认为找到了目标。
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 ",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