在图形屏幕上寻找东西,我目前不知道如何在图像中找到给定的形状。图像中的形状可能具有不同的比例,并且当然会有一些未知的 x,y 偏移。
除了不同尺度导致的像素伪影之外,两张图像中也有一点噪音,所以我需要一个稍微宽容的搜索。
这是我正在寻找的图像。
它应该出现在我的(双)屏幕缓冲区的屏幕转储中,大小约为 3300 x 1200 像素。我当然希望在浏览器窗口中找到它,但这些信息不应该是必需的。
这个练习的目的(到目前为止)是想出一个结果:
- 是的,在我的屏幕上(或没有)找到了木制框架(颜色近似,形状可能略有截断);和
- 游戏的客户区(框架内的黑色区域)占据了从
(x1,y1)
到的矩形(x2,y2)
。
我希望对缩放和抖动可能引入的噪声具有鲁棒性。另一方面,我可以排除一些常见的 CV 挑战,例如旋转或非刚性。这种框架形状对于人脑来说非常容易辨别,对于专用软件来说有多难?这是一个 Adobe Flash 应用程序,直到最近我还认为从游戏 GUI 中感知图像应该很容易。
我正在寻找一种算法,该算法能够找到针和干草堆之间发生最大可能重叠的 x、y 平移,并且如果可能的话,无需通过一系列可能的比例因子进行迭代。理想情况下,该算法可以以一种独立于比例的方式抽象出图像的“形状”。
我读过一些关于傅立叶变换的有趣的东西来完成类似的事情:给定一个相同比例的目标图像,FFT 和一些矩阵数学在更大的图像中产生了与搜索模式相对应的点。但我没有将其付诸实践的理论背景,也不知道这种方法是否能优雅地处理规模问题。帮助将不胜感激!
技术:我正在使用 Clojure/Java 编程,但可以适应其他语言的算法。我认为我应该能够与遵循 C 调用约定的库进行交互,但我更喜欢纯 Java 解决方案。
您可能会理解为什么我回避展示实际图像。这只是一个愚蠢的游戏,但事实证明,屏幕阅读的任务比我想象的更具挑战性。
我显然能够对我的屏幕缓冲区进行详尽的搜索,以查找构成我的图像的像素(不包括黑色),甚至可以在一分钟内运行。但我的目标是找到使用一种与形状相匹配的技术的木制框架,而不管缩放和抖动可能产生的差异。
事实上,抖动是我在这个项目中遇到的许多挫折之一。我一直致力于通过边缘提取来提取一些有用的向量,但是边缘非常难以捉摸,因为任何给定区域的像素具有广泛不一致的颜色 - 所以很难从局部抖动伪影中分辨出真正的边缘。我不知道如此简单的游戏会产生软件难以感知的图形。
在我开始寻找特征之前,我应该从局部平均像素开始吗?我应该通过丢弃像素颜色值的最低有效位来减少颜色深度吗?
我正在尝试一个纯 Java 解决方案(实际上是在 Clojure/Java 混合中编程),所以我对 opencv(它使用 C 代码安装 .DLL 或 .so)并不感兴趣。请不要担心我的语言选择,学习体验对我来说比表演更有趣。