【问题标题】:OpenCV : Fast Template matching algorithmOpenCV:快速模板匹配算法
【发布时间】:2015-11-18 16:09:39
【问题描述】:

我目前正在尝试在视频中查找图像。主要目标是跟随视频上的一些动作,例如按下按钮或屏幕上显示的弹出窗口。

我正在使用的代码使用 OpenCV 模板匹配功能:

    // For SQDIFF and SQDIFF_NORMED, the best matches are lower values. For all the other methods, the higher the better
    if( matchingMethod  == CV_TM_SQDIFF || matchingMethod == CV_TM_SQDIFF_NORMED )
        matchLoc = minLoc;
    else
        matchLoc = maxLoc;

    if( !((matchLoc.x == 0) && (matchLoc.y == 0)) || maxVal >= 0.8)
        return TRUE;

    return FALSE;
}

测试是用这两个模板完成的:

并且完整的图像是 3840x2160 的图像(我不能只显示整个图像,因为它在 bmp 中太大了):

1) 问题是,对于两个像素差异很小的模板,算法怎么可能检测到第一个但完全跳过第二个? 2)颜色深度是否可能会导致检测问题?

  • 两个模板都加载为 24 位深度的 BMP 文件。源图像转换为 24 位深度。
  • 阈值设置为 0.92 以获得良好的准确性
  • MaxLevels 设置为 1 以获得非常好的准确性,因为 2 找不到任何匹配项

感谢您的帮助和建议

【问题讨论】:

    标签: c++ algorithm opencv template-matching


    【解决方案1】:

    对于那些可能有同样问题的人,我只需要以不同的方式管理返回值。

    代替

    if( !((matchLoc.x == 0) && (matchLoc.y == 0)) || maxVal >= 0.8)
            return TRUE;
    

    一旦找到潜在匹配(80% 匹配)就会返回 true。

    现在只有当 maxVal 高于 0.99 时我才返回 true,这意味着非常匹配。

    if( maxVal >= 0.99)
            return TRUE;
    

    我更改的第二个元素是用于对像素值进行分类的阈值。我已将此值降低到 0.82 而不是 0.94 以获得更多可能的匹配,然后使用 maxVal 值进行过滤。

    【讨论】:

      猜你喜欢
      • 2018-03-01
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多