OpenCV cvMatchTemplate相同的图像大小

OpenCV cvMatchTemplate相同的图像大小,opencv,Opencv,我目前正试图找到两个1×1图像之间的归一化互相关。所以为了做到这一点,我使用了cvMatchTemplate。但是在使用cvMinMaxLoc之后,对于任何2个1乘1的图像,maxval始终返回1.00000 所以我尝试在6×3图像和3×3图像上使用cvMatchTemplate来绕过这个问题。对于每个原始像素,我将其扩展为6×3和3×3,以查看这是否能提供更好的结果。没有。maxval仍然返回1.000000。有没有更好的方法找到2像素之间的NCC cvSetImage

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

所以我尝试在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);
cvSetImageROI(img,cvRect(curWidth,curHeight,1,1));
IplImage*tempROI=cvCreateImage(cvSize(1,1),img->depth,img->nChannels);
cvCopy(img,tempROI);
CVR图像ROI(img);
IplImage*currentROI=cvCreateImage(cvSize(6,3),img->depth,img->nChannels);
对于(int i=0;i<3;i++){
对于(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\u img->depth,opp\u img->nChannels);
cvCopy(opp_img,tempROI);
cvResetImageROI(opp_img);
IplImage*centerROI=cvCreateImage(cvSize(3,3),opp\u img->depth,opp\u img->nChannels);
对于(int i=0;i<3;i++){
对于(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(当前ROI、中心ROI、re、CV\u TM\u CCORR\u NORMED);
cvMinMaxLoc(re,&minval,&maxval,&minloc,&maxloc);

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

检查归一化互相关背后的数学。您会发现,在1*1图像的情况下,您将始终获得1.0 NCC-NCC的主要思想是忽略强度差异。

对不起,我的问题中有一个输入错误。maxval返回1.0000而不是maxloc。这会改变什么吗?或者1.000在直觉上仍然有意义吗?如果我比较两个1乘1的图像,我希望maxval在-1和1之间。