Opencv的cvMatchTemplate模板匹配根据阈值判断匹配

在看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

   {

          这不是目标

   }

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页