模板匹配

目标匹配函数:

cvMatchTemplate( const CvArr* image, const CvArr* templ,

                              CvArr* result, int method );

image

待搜索图像

 

templ

模板图像

 

result

匹配结果

 

method

计算匹配程度的方法

 

关于匹配方法,使用不同的方法产生的结果的意义可能不太一样,有些返回的值越大表示匹配程度越好,而有些方法返回的值越小表示匹配程度越好

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

 

 

通过cvMinMaxLoc获取最后的最佳匹配结果


	IplImage*src,*templat,*result,*show;
	int srcW,templatW,srcH,templatH,resultW,resultH;
	
	//加载源图像
	src = cvLoadImage("./images/src.jpg" , CV_LOAD_IMAGE_GRAYSCALE);

	//用于显示结果
	show = cvLoadImage("./images/src.jpg");

	//加载模板图像
	templat = cvLoadImage("./images/template.png" , CV_LOAD_IMAGE_GRAYSCALE);

	if(!src || !templat)
	{
		printf("打开图片失败");
		return 0;
	}

	srcW = src->width;
	srcH = src->height;

	templatW = templat->width;
	templatH = templat->height;

	if(srcW<templatW || srcH<templatH)
	{
		printf("模板不能比原图小");
		return 0;
	}

	//计算结果矩阵的大小
	resultW = srcW - templatW + 1;
	resultH = srcH - templatH + 1;

	//创建存放结果的空间
	result = cvCreateImage(cvSize(resultW,resultH),32,1);

	double minVal,maxVal;
	CvPoint minLoc,maxLoc;

	//调用模板匹配函数
	cvMatchTemplate(src,templat,result,CV_TM_SQDIFF);

	//查找最相似的值及其所在坐标
	cvMinMaxLoc(result,&minVal,&maxVal,&minLoc,&maxLoc,NULL);

	printf("minVal  %f   maxVal %f\n ",minVal,maxVal);

	//绘制结果 
	cvRectangle(show,minLoc,cvPoint(minLoc.x+templat->width,minLoc.y+templat->height),CV_RGB(0,255,0),1);

	//显示结果
	cvNamedWindow("show");
	cvNamedWindow("tem");
	cvShowImage("show",show);
	cvShowImage("tem" , templat);
	cvWaitKey(0);


//匹配多个-----

CvPoint getNextMinLoc(IplImage* result , int templatWidth,int templatHeight,double maxValIn , CvPoint lastLoc)
{

	int y,x;
	int startY,startX,endY,endX;

	//计算大矩形的左上角坐标
	startY = lastLoc.y - templatHeight;
	startX = lastLoc.x - templatWidth;

	//计算大矩形的右下角的坐标  大矩形的定义 可以看视频的演示
	endY = lastLoc.y + templatHeight;
	endX = lastLoc.x + templatWidth;

	//不允许矩形越界
	startY = startY < 0 ? 0 : startY;
	startX = startX < 0 ? 0 : startX;
	endY = endY > result->height-1 ? result->height-1 : endY;
	endX = endX > result->width - 1 ? result->width - 1 : endX; 

	//将大矩形内部 赋值为最大值 使得 以后找的最小值 不会位于该区域  避免找到重叠的目标
	for(y=startY;y<endY;y++)
	{
		for(x=startX;x<endX;x++)
		{
			cvSetReal2D(result,y,x,maxValIn);//把已经处理的区域标记为做大值
		}
	}

	double minVal,maxVal;
	CvPoint minLoc,maxLoc;

	//查找result中的最小值 及其所在坐标
	cvMinMaxLoc(result,&minVal,&maxVal,&minLoc,&maxLoc,NULL);

	return minLoc;

}













  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值