OpenCV的cvMatchTemplate用法


 首先,参看上图。假设褐色的大图为待测图片,红色小图为模板图片。

       1.result中数据的含义。

       模板匹配函数cvMatchTemplate依次计算模板与待测图片的重叠区域的相似度,并将结果存入映射图像result当中,也就是说result图像中的每一个点的值代表了一次相似度比较结果。

      2.result的尺寸大小。

       如图可知,模板在待测图像上每次在横向或是纵向上移动一个像素,并作一次比较计算,由此,横向比较W-w+1次,纵向比较H-h+1次,从而得到一个(W-w+1)×(H-h+1)维的结果矩阵,result即是用图像来表示这样的矩阵,因而图像result的大小为(W-w+1)×(H-h+1)。

       3.如何result中获得最佳匹配区域

       使用函数cvMinMaxLoc(result,&min_val,&max_val,&min_loc,&max_loc,NULL);从result中提取最大值(相似度最高)以及最大值的位置(即在result中该最大值max_val的坐标位置max_loc,即模板滑行时左上角的坐标,类似于图中的坐标(x,y)。)

         由此得到:rect=cvRect(max_loc.x,max_loc.y,tmp->width,tmp->height);rect表示的矩形区域即是最佳的匹配区域。


来源:http://034080116.blog.163.com/blog/static/334061912009116498997/


通过一个程序进行了测试了下,上面的说明中有个错误的地方。最佳匹配区域的矩形应该使用min_loc来决定,即:

rect=cvRect(max_loc.x,max_loc.y,tmp->width,tmp->height);


效果图如下:

模板:        要匹配的图:    匹配结果:

int main() {
	IplImage *src, *temp1, *ftmp;

	if ((src = cvLoadImage("/home/murphy/Pictures/1.jpg", 1)) == 0) {
		return -1;
	}
	if ((temp1 = cvLoadImage("/home/murphy/Pictures/Screenshot-3.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, 0);
	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;
}

昨天在另一个帖子里发现了确定矩形位置是使用的是max_loc,今天又查了下资料,原来这个跟匹配时采用的方法参数有关,具体如下:

  关于参数 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 归一化相关系数匹配法



评论 6 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值