【问题标题】:Alpha-dependent template matching依赖于 Alpha 的模板匹配
【发布时间】:2012-08-27 09:28:54
【问题描述】:

我正在使用具有 CUDA / CUBLAS / CUFFT 支持的 OpenCV 在灰度屏幕截图上执行一些非常基本的模板匹配以提取一些文本,这意味着我可以假设以下内容:

我确实知道我尝试匹配的原始精灵的确切大小、颜色和旋转,也就是说,我可以访问在观察程序的渲染过程中使用的纹理。

但是,由于精灵是部分透明的,通过cv::(gpu::)matchTemplate(使用标准化互相关)进行的正常模板匹配无法正常工作,因为透明区域的偏差对整体相关性有太大的负面影响。

基本上,这些示例很好地总结了我想要实现的目标:

给定要匹配的模板及其 alpha 掩码:

我希望此类图片的匹配度高至接近 100% (任意背景,透明区域中的随机东西,部分遮挡):

但是,像这样的图像只会产生非常低的百分比(颜色错误,全黑):

目前我正在使用edge detection 来获得一些不错的匹配(Canny + 互相关),但正如您所见,根据背景,图像中可能存在也可能不存在边缘,这会产生不可靠的结果和通常匹配非常“前卫”的区域。

我做了一些数学运算,得出了一个依赖于 alpha 的标准化互相关(基本上将 alpha 掩码预乘到模板和图像上),它在纸上运行良好,但几乎不可能很好地实现表现。 是的,性能确实是个问题,因为多个 sprite (~10) 必须近乎实时 (~10 FPS) 进行匹配才能跟上程序的速度。

我有点想不通了。有什么标准的方法吗?有什么想法或建议吗?

【问题讨论】:

    标签: c++ opencv cuda template-matching


    【解决方案1】:

    所以我终于设法自己使用一些数学和 CUFFT 解决了这个问题。我将其称为“Alpha-weighted normed cross-correlation”。这里是:

    使用这种方法,对于像 OP 中的情况,我得到了非常好的匹配 (> 0.99)。 它进一步有助于将 alpha 蒙版设置为阈值以简单地忽略大多数透明像素。

    【讨论】:

    • 嘿,这听起来很有趣。你有任何实现的代码吗?此外,它与此 (docs.opencv.org/doc/tutorials/imgproc/histograms/…) 链接中的 openCV 的第 4 种算法 (method=CV_TM_CCORR_NORMED) 有何不同?你能解释一下吗?
    • 我已经有一年多没有做这个了,如果我对此有点生疏,请原谅。不过,我能够为此挖掘代码:link。我认为这应该是它的重要部分。主要区别在于我的版本将模板图像和目标图像的相应部分预乘以模板的 alpha 值。这使得更透明的像素对匹配过程的贡献更少。当您将 C_{T,I}(即 CV_TM_CCORR_NORMED)与 C_{alpha,T,I} 进行比较时,您可以看到差异。
    • 非常感谢您的帮助。我从未使用过 CUFFT,但我一直在使用 openCV。你能告诉我成功编译上述代码需要哪些额外的 header_files 和源。此外,使用相同的 alpha 再次预乘目标图像的技巧是什么。这对我们有什么帮助,因为我们真的在那里丢失了一些信息?我想学习一些关于这个实现的概念(图像处理中的 FFT)。请给我一些好的指点。提前致谢。
    • 省略信息才是重点。但是,您不会预乘整个目标图像。您预乘您正在“滑动”您的模板图像的当前子图像。您必须在空间域中的循环中执行此操作。在频域中,您可以使用(复共轭)模板图像和目标子图像(卷积定理)的简单分量乘积。查看维基百科的互相关和卷积定理。这就是你所需要的。唯一需要的非 OpenCV 头文件是 cufft.h。您可以通过简单地创建 GpuMat 来初始化 CUDA。
    • 您看起来像是这方面的专家。我只是一个初学者。请建议我一些很好的资源来学习这些图像处理的东西,比如图像上的 FFT 等,如果你有一个电子副本,请将它邮寄到 gmail dot com 的 tsnlegend。提前致谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多