如何检测屏幕上是否有图像?

2024-06-01 02:26:20 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我需要检测的图像:http://s13.postimg.org/wt8qxoco3/image.png

下面是base64表示:http://pastebin.com/raw.php?i=TZQUieWe

我之所以请求你的帮助,是因为这是一个复杂的问题,我没有能力解决它。我一个人可能要花一个星期的时间。

我想到的一些伪代码:

1)截取应用程序的截图,并将其存储为图像对象。

2)将图像的binary64表示转换为图像对象。

3)使用某种算法/函数比较两个图像对象。

在屏幕上,我是说在应用程序中。我有应用程序的窗口名和PID。

为了100%清晰,我需要基本上检测image1是否在image2内部。图像1是我在操作中给出的图像。图像2是窗口的屏幕截图。


Tags: 对象org图像imagecom应用程序httpraw
3条回答

如果你把它分解成碎片,它们都很简单。

首先,你需要一个二维像素数组的应用程序窗口截图。有很多不同的方法可以用特定于平台的方式来实现这一点,但是你没有提到你在哪个平台上,所以…让我们使用PIL抓取整个屏幕:

screenshot = ImageGrab.grab()
haystack = screenshot.load()

现在,您需要将base64转换为图像。快看一下,它显然只是一个编码的PNG文件。所以:

decoded = data.decode('base64')
f = cStringIO.StringIO(decoded)
image = Image.open(f)
needle = image.load()

现在你得到了一个二维像素数组,你想看看它是否存在于另一个二维数组中。使用numpy有更快的方法来实现这一点可能是最好的,但也有一种愚蠢的暴力方法,这种方法更容易理解:只需迭代haystack的行;对于每一行,迭代列,然后查看是否找到与needle的第一行匹配的字节运行。如果是,请继续浏览其余行,直到完成所有的needle,在这种情况下返回True,或者发现不匹配,在这种情况下返回continue,然后在下一行重新开始。

这可能是最好的开始:

http://effbot.org/imagingbook/image.htm

如果你不能访问图像的元数据、文件名、类型等,你要做的是非常困难的,但是你的伪声音是正确的。基本上,你必须根据照片的形状、线条、大小、颜色等创建一个算法模型,然后你必须将该模型与一些数据库中已经创建并索引的模型相匹配。希望能有所帮助。

看起来https://python-pillow.org/是PIL的更新版本。

相关问题 更多 >