功能:模板匹配是通过在输入图像上滑动模板图像块对实际的图像块和输入图像进行匹配,并且可以利用函数cvMinMaxLoc()找到最佳匹配的位置。例如在工业应用中,可以锁定图像中零部件的位置,并根据具体的位置,进行具体的处理。匹配的过程中可以使用不同的method,通过最合适的method,进行最合适的匹配。
函数形式:void cvMatchTemplate( const CvArr* image,const CvArr* templ, CvArr* result, int method );
参数列表:
image 欲搜索的图像。它应该是单通道、8-比特或32-比特 浮点数图像
templ 搜索模板,不能大于输入图像,且与输入图像具有一样的数据类型
result 比较结果的矩阵。单通道、32-比特浮点数.如果图像是 W×H而 templ是 w×h,则 result一定是 (W-w+1)×(H-h+1)。从结果矩阵中找到相似度最高的座标。
method 指定匹配方法:
CV_TM_SQDIFF平方差匹配法:该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大。
CV_TM_CCORR相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。
CV_TM_CCOEFF相关系数匹配法:1表示完美的匹配;-1表示最差的匹配。
CV_TM_SQDIFF_NORMED归一化平方差匹配法
CV_TM_CCORR_NORMED归一化相关匹配法
CV_TM_CCOEFF_NORMED归一化相关系数匹配法
程序应用示例:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <string>
using namespace cv;
using namespace std;
int main() {
IplImage *src, *temp1, *ftmp;
if ((src = cvLoadImage("1.jpg", 1)) == 0) {
return -1;
}
if ((temp1 = cvLoadImage("1-1.png", 1)) == 0) {
return -1;
}
int iwidth = src->width - temp1->width + 1;
int iheight = src->height - temp1->height + 1;
ftmp = cvCreateImage(cvSize(iwidth, iheight), 32, 1);
double min_val;
double max_val;
CvPoint min_loc;
CvPoint max_loc;
cvMatchTemplate (src, temp1, ftmp, CV_TM_SQDIFF); //使用CV_TM_SQDIFF方法匹配
cvMinMaxLoc(ftmp, &min_val, &max_val, &min_loc, &max_loc, NULL); //匹配图像的座标
cvRectangle(src, cvPoint(min_loc.x, min_loc.y), cvPoint((min_loc.x + temp1->width),(min_loc.y + temp1->height)), CV_RGB(0,255,0), 1); //画矩形
cvNamedWindow("src",1);
cvShowImage("src",src);
cvWaitKey(0);
return 0;
}