在看lbd2008转载的文章的时候,(http://blog.csdn.net/lbd2008/article/details/7166279),他的作者对
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)。)
以及他们的使用方法进行了详细说明,但是文章只提到了最佳匹配区域。当我们的源图像有很多的匹配区域的时候,如下如的情况,我们需要设定一个阈值来进行判断,这时候怎么办呢?
这个时候,我们需要在匹配的时候用一个阈值来判断,从结果result数组就是匹配的结果,我们采用归一化的方法后,比如CV_TM_SQDIFF_NORMED,然后直接读取result
的值,和我们的阈值做比较即可。
//创建匹配结果
IplImage* res = cvCreateImage( cvSize( res_width, res_height ), IPL_DEPTH_32F, 1 );
cvMatchTemplate(FatherImg,TemplateImg, res,bMethod);
//找到符合最低匹配要求的点
CPoint PtTemp;
float fTemp=0;
for (int i=0;i<res->width;i++)
{
for (int j=0;j<res->height;j++)
{
fTemp=CV_IMAGE_ELEM(res,float,j,i); //获得匹配结果的匹配度值
if (bMethod!=CV_TM_SQDIFF_NORMED)
{
if (fTemp>PrScore) //阈值比较
{
PtTemp.x=i;
PtTemp.y=j;
ArryOutPt.Add(PtTemp);
}
}
else
{
if (fTemp<(1-PrScore))
{
PtTemp.x=i;
PtTemp.y=j;
ArryOutPt.Add(PtTemp);
}
}
}
}
比如
我设定
if(fTemp>0.91)
{
这是目标
}
else
{
这不是目标
}