我目前正在尝试找到两个1 x 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);
答案 0 :(得分:2)
检查归一化互相关背后的数学运算。您会发现,在1 * 1图像的情况下,您将始终获得1.0 NCC - NCC的主要思想是忽略强度差异。 http://opencv.willowgarage.com/documentation/c/object_detection.html
答案 1 :(得分:1)
可以在1×1图像或具有相同图像尺寸的任何图像上进行NCC,但通常没用。如果在图像I中搜索模板T,结果将是尺寸为I - T + 1的R,因此如果图像大小相同,则结果为1x1。如果您在任何具有该尺寸(1x1)的图像中搜索minmax位置,它将按预期返回1.000。