2011-02-18 140 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

相關問題