2011-02-18 83 views
1

我目前正在尝试查找两个1乘1图像之间的归一化交叉相关。所以为了做到这一点,我使用了cvMatchTemplate。但是在使用cvMinMaxLoc之后,对于任何2个1×1的图像,maxval始终返回1.00000。OpenCV cvMatchTemplate相同的图像大小

所以我试图通过尝试在6乘3图像和3乘3图像上使用cvMatchTemplate来绕过这一点。对于每个原始像素,我将它扩展为6乘3和3乘3,以查看这是否会提供更好的结果。它没有。 maxval仍然返回1.000000。有没有更好的方法来找到2像素之间的NCC?

  cvSetImageROI(img, cvRect(curWidth, curHeight, 1, 1)); 
      IplImage* tempROI = cvCreateImage(cvSize(1, 1), img->depth, img->nChannels); 
      cvCopy(img, tempROI); 
      cvResetImageROI(img); 

      IplImage* currentROI = cvCreateImage(cvSize(6,3), img->depth, img->nChannels); 
      for (int i = 0; i < 3; i++) { 
       for (int j = 0; j < 6; j++) { 
        cvSetImageROI(currentROI, cvRect(j, i, 1, 1)); 
        cvCopy(tempROI, currentROI); 
        cvResetImageROI(currentROI); 
       } 
      } 

      cvReleaseImage(&tempROI); 
      cvSetImageROI(opp_img, cvRect(opp_loc, curHeight, 1, 1)); 
      tempROI = cvCreateImage(cvSize(1, 1), opp_img->depth, opp_img->nChannels); 
      cvCopy(opp_img, tempROI); 
      cvResetImageROI(opp_img); 

      IplImage* centerROI = cvCreateImage(cvSize(3,3), opp_img->depth, opp_img->nChannels); 
      for (int i = 0; i < 3; i++) { 
       for (int j = 0; j < 3; j++) { 
        cvSetImageROI(centerROI, cvRect(j, i, 1, 1)); 
        cvCopy(tempROI, centerROI); 
        cvResetImageROI(centerROI); 
       } 
      } 
      IplImage *re = cvCreateImage(cvSize(4, 1), IPL_DEPTH_32F, 1); 
      cvZero(re); 
      cvMatchTemplate(currentROI, centerROI, re, CV_TM_CCORR_NORMED); 
      cvMinMaxLoc(re, &minval, &maxval, &minloc, &maxloc); 

回答

1

可以在1x1的图像或具有相同图像大小的任何图像上进行NCC,但通常无用。如果在图像I中搜索模板T,结果将为R,尺寸为I - T + 1,因此如果图像大小相同,则结果为1x1。如果您在任何具有该尺寸(1x1)的图像中搜索minmax位置,它将按预期返回1.000。

+0

对不起,我的问题有一个错字。 maxval返回1.0000而不是maxloc。这是否会改变什么呢?还是1.000依然直觉上有意义?如果我比较两个1乘1的图像,我期望maxval在-1和1之间的范围内。 – 2011-02-18 22:44:23

相关问题