我使用带有两个示例图像的OpenCV在MATLAB和C ++中进行模板匹配,但得到了不同的结果。

我的示例图像是:

作物

模板匹配和深度学习方法的 模板匹配算法的缺点_相似度

温度

模板匹配和深度学习方法的 模板匹配算法的缺点_相似度_02

当我使用时:

Mat crop = imread("crop.jpg",0),
temp = imread("temp.jpg",0);
int resultWidth = crop.cols-temp.cols + 1;
int resultHeigth = crop.rows -temp.rows + 1;
Mat result = cvCreateImage(cvSize(resultWidth ,resultHeigth),32,1);
matchTemplate(crop,temp,result ,CV_TM_CCORR_NORMED);
double minval, maxval;
CvPoint minloc, maxloc;
cvMinMaxLoc(&(IplImage)result ,&minval,&maxval,&minloc,&maxloc,NULL);

maxvalue的值为0.93058246374130249。

在Matlab中:

temp = rgb2gray(imread('temp.jpg'));
crop = rgb2gray(imread('crop.jpg'));
tempMat = normxcorr2(tmep,crop);
[res,index] = max(max(abs(tempMat)));

在这种情况下,答案为0.5753。

为什么归一化互相关的最大值不同?

在您的OpenCV代码中,您正在将过时的C语法与C ++语法混合在一起。 您应该避免这样做。

您的模板图像大于图像本身。 这将行不通(您可能上传了错误的模板)。

为了使其工作,我使用了以下参考图像:

模板匹配和深度学习方法的 模板匹配算法的缺点_相似度_03

并作为模板:

模板匹配和深度学习方法的 模板匹配算法的缺点_模板匹配_04

这是要使用的(正确)OpenCV代码:

#include 
using namespace cv;
int main()
{
Mat1b img = imread("path_to_image", IMREAD_GRAYSCALE);
Mat1b templ = imread("path_to_template", IMREAD_GRAYSCALE);
// Compute match
Mat result;
matchTemplate(img, templ, result, TM_CCORR_NORMED);
// Get best match
Point maxLoc;
double maxVal;
minMaxLoc(result, NULL, &maxVal, NULL, &maxLoc);
// Display result
Mat3b res;
cvtColor(img, res, COLOR_GRAY2BGR);
rectangle(res, Rect(maxLoc.x, maxLoc.y, templ.cols, templ.rows), Scalar(0, 255, 0));
imshow("Match", res);
waitKey();
return 0;
}

产生以下结果:

模板匹配和深度学习方法的 模板匹配算法的缺点_OpenCV_05

这是要使用的(正确)Matlab代码:

temp = rgb2gray(imread('path_to_template'));
img = rgb2gray(imread('path_to_image'));
% Perform cross-correlation
c = normxcorr2(temp,img);
% Find peak in cross-correlation
[ypeak, xpeak] = find(c==max(c(:)));
% Account for the padding that normxcorr2 adds
yoffSet = ypeak-size(temp,1);
xoffSet = xpeak-size(temp,2);
% Displat matched area
hFig = figure;
hAx  = axes;
imshow(img,'Parent', hAx);
imrect(hAx, [xoffSet, yoffSet, size(temp,2), size(temp,1)]);

产生以下结果:

模板匹配和深度学习方法的 模板匹配算法的缺点_模板匹配和深度学习方法的_06

如您所见,结果是等效的。 匹配结果矩阵中的实际最大数量为:

OpenCV: 0.99999815225601196

Matlab: 0.999988754172261

我们可以认为是平等的。 细微的差异可能是由于内部实施中的细微差异,但并不相关。

感谢@Miki的回答。但是有一些问题。

1.在上传的图片中," crop.jpg"(第一张)是我的主图像," temp.jpg"(第二张)是模板。所以我没错上传模板。 2.对于我的问题,最重要的是模板匹配操作的最终结果。(0.0?> 1.0,数字越大,表示模板与图像越相似)3.在您的MATLAB代码中,如何获取互相关系数? 4.实际上我想知道为什么在opencv中,获得的系数不能表示两个图像之间正确的相似度? (在我的情况下,结果是0.93 !!)

1)好吧,只是因为它的白噪声图像而感到困惑。 2)我在答案的最后部分提到了价值观。 3)mavVal = max(c(:)); 4)不清楚。这是指示性的。您是否在原始图像上尝试过我的代码?输出是什么?

您可以为这些图片做这些:图像模板@Miki

我可能明白你的意思。但是,不进行模板匹配来比较两个图像之间的相似性,而是在较大的图像内找到一个小的模板。我得到两个最大不同的匹配结果(例如0.8和0.2),但是那是因为您做了不应该做的事情。

好,谢谢。您说模板匹配"在较大的图像中查找一个小的模板。"我有一部分大图像作为模板,有那么多大图像类型的图片。我会在指定区域查看这些图片作为模板。 (我希望我能解释我的目的!!)因此,我使用模板匹配来确保所需坐标中确实存在该模板(因为有可能像您在发送的图片中看到的那样移动或覆盖了所需的模板) ,根据此描述,您有什么建议?

对我来说还不太清楚,对不起。看看docs.opencv.org/doc/tutorials/features2d/feature_homography/

哦!我真的很抱歉,因为我的英语太弱了,请原谅我。您能告诉我我的解释的哪一部分是模棱两可的(请不要全部说出来!)以尝试改进它们。

我正在寻找在大图片中的特定对象。您提出的解决方案是什么? @三木

我今天很忙,对不起...大对象中的特定对象:请再次检查我先前评论中的链接

抱歉,@ Miki我可以在这里与您聊天吗(例如电子邮件)?请

@ s.a.t对不起,但没有。考虑创建一个新问题来解决您的特定问题。

根据这个对话(!),你能告诉我在使用matchTemplate之后调用的opencv的minmaxLoc函数中的" maxval"是什么吗?因为我认为该值是图像和模板之间的相似度。如果不是这样,如何计算两个任意图像之间的相似度百分比?