【问题标题】:Improving image matching accuracy with OpenCV matchTemplate使用 OpenCV matchTemplate 提高图像匹配精度
【发布时间】:2014-09-08 02:14:57
【问题描述】:

我正在制作一个 iOS 应用程序,它将在较大的图像中找到较小(相似)图像的实例。例如,类似:

我们在里面搜索的图片

我们正在搜索的图片

匹配的图片

要考虑的主要事项是,smallImage 的大小将与 bigImage 中目标的大小相匹配,但对象在 bigImage 中可能会稍微模糊(因为它们并不总是相同)。此外,我正在处理的图像比我这里的示例小很多,我试图匹配的图像(smallImage)在 32 x 32 像素和 80 x 80 像素之间,大图像大约 1000 x 600像素。除了可能被稍微遮挡之外,smallImage 将在各个方面(大小、颜色、旋转等)匹配大图像中的对象。

我已经尝试了一些使用 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 之间)

这确实有效,但存在一些问题。

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

接下来我使用图像的较小部分进行了测试,例如:

这提高了在大图像中找到目标的准确性,但也会导致很多不正确的匹配。

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

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

编辑: 我用谷歌搜索了负载,最有用的帖子是:

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

【问题讨论】:

  • 您阅读过that question 及其答案吗?问题似乎与您很接近。
  • @AldurDisciple 我有,答案建议使用特征匹配而不是模板匹配,我已经尝试过,据我所知,最适合旋转/倾斜/缩放匹配图像的情况。我的特征匹配实现有效,但给出了大量错误匹配,并且没有足够的正确匹配能够自信地识别匹配的图像
  • 您正在搜索的对象是否会在图像中旋转?
  • @BharatSingh 不,模板图像正是搜索图像中的显示方式,没有任何旋转/倾斜/颜色变化/扭曲(除了可能被部分遮挡,但不超过可能是 20%)
  • 尝试在模板中添加一个遮罩,这样统一的白色背景就被遮住了,从而不会干扰分数。你可能需要在那里留一个小边界,这样冰箱的边缘就不会被遮住。

标签: ios objective-c opencv image-processing


【解决方案1】:

如果模板图像在您正在搜索的图像中未旋转(或在某些投影失真下) - 由于保留了所有几何和纹理属性(假设遮挡不是很大),剩下的唯一变量是规模。因此,在原始模板的多个尺度上运行模板匹配算法,然后在所有尺度上取最大归一化响应应该得到完美匹配。一个问题可能是,对于完美匹配,猜测(优化)确切的比例将在计算上很昂贵或涉及一些启发式方法。一种启发式方法可以是,以 3 个不同的尺度(1、2、4)运行模板匹配,假设您在特定尺度(比如 2)获得最佳响应,在 (1.5、2.25、3) 之间尝试并继续改进。当然,这是一种启发式方法,在实践中可能效果很好,但在理论上并不是找到正确比例的正确方法,并且可能会陷入局部最小值。

基于特征的方法不适用于此类图像的原因是它们依赖于纹理/锐化渐变,这在您展示的同质模板图像中不是很明显。

【讨论】:

  • 感谢您的回答。模板图像的大小与搜索图像中显示的完全相同。+1 因为特征匹配不起作用,我认为特征匹配更适用于“有机”图像,例如照片。
  • 运行不同的音阶最终对我有用,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 2012-02-12
相关资源
最近更新 更多