【发布时间】: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