我正在使用具有 CUDA / CUBLAS / CUFFT 支持的 OpenCV 在灰度屏幕截图上执行一些非常基本的模板匹配以提取一些文本,这意味着我可以假设以下内容:
我确实知道我试图匹配的原始精灵的确切大小、颜色和旋转,即,我可以访问在观察程序的渲染过程中使用的纹理。
然而,由于精灵是部分透明的,正常的模板匹配通过cv::(gpu::)matchTemplate
(使用规范互相关)不能正常工作,因为透明区域的偏差对整体相关性有太大的负面影响。
基本上这些例子很好地总结了我想要实现的目标:
给定要匹配的模板及其 alpha 掩码:
我希望对这样的图像进行高到接近 100% 的匹配(任意背景、透明区域中的随机内容、部分遮挡):
然而,像这样的图像应该只产生非常低的百分比(错误的颜色,全黑):
目前我正在使用边缘检测来获得一些不错的匹配(Canny + 互相关),但正如您所看到的,根据背景,图像中可能存在也可能不存在边缘,这会产生不可靠的结果并且通常非常匹配“前卫”的领域。
我做了一些数学运算,得出了一个依赖于 alpha 的标准化互相关(基本上将 alpha 掩码预乘到模板和图像上),它在纸上运行良好,但几乎不可能以良好的性能实现。是的,性能确实是一个问题,因为多个精灵 (~10) 必须以近乎实时的方式 (~10 FPS) 匹配以跟上程序的速度。
我有点想不通了。有什么标准的方法吗?有什么想法或建议吗?