依赖于Alpha的模板匹配

时间:2012-08-27 09:28:55

标签: c++ opencv cuda template-matching

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

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

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

基本上这些例子总结了我正在努力实现的目标:

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

Sprite template to be matched. Template alpha mask.

我希望像这样的图像高达100%匹配 (任意背景,透明区域中的随机内容,部分遮挡):

Sprite on white background. Sprite on black background Arbitrary background + transparent region partially occluded. Partially occluded.

然而,像这样的图像应该只产生非常低的百分比(错误的颜色,完全是黑色): enter image description here enter image description here

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

我已经做了一些数学计算来得出一个依赖于alpha的标准互相关(基本上将alpha蒙版预先乘以模板和图像),这在纸上工作得很好,但几乎不可能实现良好的性能。 是的,性能确实是一个问题,因为多个精灵(~10)必须近乎实时匹配(~10 FPS)才能跟上程序的速度。

我在这里有点想法。对此有任何标准方法吗?有什么想法或建议吗?

1 个答案:

答案 0 :(得分:4)

所以我终于使用一些数学和CUFFT设法解决了这个问题。我将其称为“Alpha加权的标准互相关”。这是:

Alpha-weighted normed cross-correlation

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