使用OpenCV matchTemplate提高图像匹配精度

4
我正在开发一个iOS应用程序,它可以在大图片中查找小(相似)图像的实例。例如: The image we are searching inside The image we are searching inside enter image description here The image we are searching for enter image description here The matched image 需要考虑的主要问题是,smallImage 的大小将与 bigImage 中的目标匹配,但在 bigImage 中可能会略微遮挡对象(因此它们不总是完全相同)。另外,我处理的图像比这里的示例要小得多,我尝试匹配的图像(smallImage)大小在 32 x 32 像素和 80 x 80 像素之间,而大图像约为 1000 x 600 像素。除了可能会被遮挡之外,smallImage 在大小、颜色、旋转等方面都与 big image 中的对象匹配。
我尝试使用 OpenCV 进行了几种方法。特征匹配似乎不够准确,并给我带来了数百个无意义的结果,因此我正在尝试模板匹配。我的代码看起来像:
cv::Mat ref = [bigImage CVMat];
cv::Mat tpl = [smallImage CVMat];
cv::Mat gref, gtpl;
cv::cvtColor(ref, gref, CV_LOAD_IMAGE_COLOR);
cv::cvtColor(tpl, gtpl, CV_LOAD_IMAGE_COLOR);
cv::Mat res(ref.rows-tpl.rows+1, ref.cols-tpl.cols+1, CV_32FC1);
cv::matchTemplate(gref, gtpl, res, CV_TM_CCOEFF_NORMED);
cv::threshold(res, res, [tolerance doubleValue], 1., CV_THRESH_TOZERO);


    double minval, maxval, threshold = [tolerance doubleValue]; 
    cv::Point minloc, maxloc;
    cv::minMaxLoc(res, &minval, &maxval, &minloc, &maxloc);

    if (maxval >= threshold) {
       // match
  • bigImage是要查找目标的大图像

  • smallImage是在bigImage中要查找的图像

  • tolerance是匹配容差(介于0和1之间)

这个方法可以工作,但存在一些问题。

我最初尝试使用整个对象图像的完整图像(即整个冰箱的图像),但我发现它非常不准确。当容差高时,它什么也没有找到,当容差低时,它会找到许多不正确的匹配项。

接下来,我尝试使用图像的较小部分,例如:

enter image description here

这提高了在bigImage中查找目标的准确性,但也导致了很多错误的匹配。

我已经尝试了这里所有可用的matchTemplate方法,它们都返回大量的错误匹配,除了CV_TM_CCOEFF_NORMED,它返回更少的匹配(但大多数也是错误的匹配)

如何在iOS中使用OpenCV提高图像匹配的准确性?

编辑: 我已经谷歌了很多,最有用的帖子是:

我找不到任何关于如何提高准确性的建议。


2
你读过这个问题和它的答案吗?这个问题似乎与你的问题很接近。 - BConic
@AldurDisciple,我已经尝试了答案推荐的特征匹配方法,相比模板匹配更为有效,尤其是在匹配图像旋转、倾斜或缩放的情况下。我的特征匹配实现虽然可行,但误匹配数量巨大,正确匹配数量不足以让我有信心确认匹配的图像。 - Brett Gregson
1
你要搜索的对象在图像中是否被旋转了? - Bharat
@BharatSingh 不,模板图像与搜索图像完全相同,没有旋转/扭曲/颜色变化/任何形式的扭曲(除了可能部分被遮挡,但最多只有20%)。 - Brett Gregson
1
尝试向模板添加一个遮罩,使得均匀的白色背景被遮蔽掉,从而不会干扰分数。你可能需要在那里留下一个小边界,以便冰箱的边缘不被遮蔽掉。 - QED
显示剩余2条评论
1个回答

3
如果模板图像在你要搜索的图像中没有旋转(或处于某些投影失真下)- 因为所有几何和纹理属性都得以保留(假设遮挡不是很大),唯一剩下的变量就是尺度。因此,在原始模板的多个尺度上运行模板匹配算法,然后在所有尺度上取最大归一化响应,应该可以得到完美的匹配。一个问题可能是,为了得到完美的匹配,猜测(优化)精确的尺度将会计算代价昂贵或涉及一些启发式算法。一种启发式算法可以是,在3个不同的尺度(1、2、4)上运行模板匹配,假设你在特定的尺度(比如2)获得了最佳响应,则在(1.5、2.25、3)之间进行尝试并不断优化。当然,这是一种启发式方法,在实践中可能效果良好,但不是找到正确尺度的理论正确方法,可能会陷入局部极小值。
基于特征的方法无法用于这种类型的图像,因为它们依赖于在你所展示的均匀模板图像中不太明显的纹理/锐度梯度。

感谢回答。模板图像的大小与搜索图像中显示的大小完全相同。对于特征匹配无法工作的原因加1,我认为特征匹配更适用于“有机”的图像,如照片。 - Brett Gregson
跑一遍不同的规模最终对我有用,谢谢。 - AgnosticDev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接