2

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

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

然而,由于精灵是部分透明的,正常的模板匹配通过cv::(gpu::)matchTemplate(使用规范互相关)不能正常工作,因为透明区域的偏差对整体相关性有太大的负面影响。

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

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

要匹配的精灵模板。模板 alpha 蒙版。

我希望对这样的图像进行高到接近 100% 的匹配(任意背景、透明区域中的随机内容、部分遮挡):

白色背景上的雪碧。黑色背景上的精灵任意背景 + 部分遮挡的透明区域。部分遮挡。

然而,像这样的图像应该只产生非常低的百分比(错误的颜色,全黑): 在此处输入图像描述在此处输入图像描述

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

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

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

4

1 回答 1

4

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

阿尔法加权标准化互相关

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

于 2012-09-02T19:34:02.507 回答