转自:http://blog.csdn.net/encesu/article/details/10335315
在看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)。)
以及他们的使用方法进行了详细说明,但是文章只提到了最佳匹配区域。当我们的源图像有很多的匹配区域的时候,如下如的情况,我们需要设定一个阈值来进行判断,这时候怎么办呢?
http://img.blog.csdn.net/20130826124217812?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZW5jZXN1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast源图像
http://img.blog.csdn.net/20130826124246875?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZW5jZXN1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast模板图像
这个时候,我们需要在匹配的时候用一个阈值来判断,从结果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;iwidth;i++)
{
for (int j=0;jheight;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
{
这不是目标
}
加载中,请稍候......