OpenCV:快速模板匹配算法

时间:2015-11-18 16:09:40

标签: c++ algorithm opencv template-matching

我目前正在尝试在视频中查找图片。主要目标是对视频执行某些操作,例如屏幕上显示的按下按钮或弹出窗口。

我正在使用的代码使用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;
}

使用这两个模板完成测试:

Template n°1 Template n°2

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

1)问题是,对于两个差异像素极少的模板,算法如何能够检测到第一个但完全跳过第二个? 2)颜色深度是否可能导致检测出现问题?

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

感谢您的帮助和建议

1 个答案:

答案 0 :(得分:0)

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

而不是

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值进行过滤。