2012-08-27 65 views
1

我使用的OpenCV与CUDA/CUBLAS/CUFFT支持,以执行对灰度屏幕截图一些非常基本的模板匹配提取一些文本,这意味着我可以假设如下:阿尔法依赖模板匹配

我不知道精确的大小,颜色和旋转的原始精灵,我试图匹配,即我可以访问被观察程序的渲染过程中使用的纹理。然而,由于精灵是部分透明的,因此通过cv::(gpu::)matchTemplate(使用规范化互相关)的正常模板匹配不能正常工作,因为透明区域中的偏差对整体相关性具有太多的负面影响。

基本上这些例子总结得很好我想要实现:

鉴于模板匹配和阿尔法遮掩:

Sprite template to be matched.Template alpha mask.

我想一个高在任何背景下,透明区域中的随机材质,部分遮挡的图像都可以近似100%地匹配:

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

然而,像这些图片只能得到很低的百分比(颜色不对,全黑): enter image description hereenter image description here

目前我使用edge detection得到一些不错的比赛(康力+交相关性),但正如您所看到的,根据背景的不同,边缘可能会或可能不会出现在图像中,从而产生不可靠的结果,并且通常会匹配非常“前卫”的区域。

我已经做了一些数学来提出一个阿尔法依赖规范互相关(基本上是将alpha蒙版预先放大到模板和图像的前面),它可以在纸上正常工作,但几乎不可能用很好的表现。 是的,性能确实是一个问题,因为多个精灵(〜10)必须近乎实时地(约10 FPS)匹配才能跟上程序的速度。

我在这里想法不多。有没有任何标准的方法呢?任何想法或建议?

回答

4

所以我终于设法使用一些数学和CUFFT来解决这个问题。我把它称为“Alpha加权规范互相关”。那就是:

Alpha-weighted normed cross-correlation

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

+0

嘿,这听起来很有趣。你有这个实现的代码片?另外,它与openCV的第4种算法(method = CV_TM_CCORR_NORMED)在这方面有多么不同(http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html#which-are-the-matching-方法可用在opencv)链接?你能解释一下吗? – saint1729

+0

我在这方面已经工作了一年多了,所以如果我对此有点生疏,请原谅。我可以通过以下代码挖掘代码:[link](http://pastebin.com/eZDRpmDm)。这应该是我认为的重要部分。主要区别在于我的版本将模板图像和目标图像的相应部分预先乘以模板的alpha值。这使得更透明的像素对匹配过程的贡献更小。当您比较C_ {T,I}(它是CV_TM_CCORR_NORMED)和C_ {alpha,T,I}时,可以看到差异。 – Opossum

+0

非常感谢您的帮助。我从来没有使用过CUFFT,但我一直在使用openCV。你能否告诉我为成功编译上述代码需要额外的header_files和sources。另外,用相同的阿尔法再次将目标图像预先放大到什么程度呢?我们真的会如何帮助我们,因为我们真的失去了一些信息?我想学习一些关于这个实现的概念(图像处理中的FFT)。请给我一些好的指点。提前致谢。 – saint1729