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

时间:2013-03-29 18:39:54

标签: python image python-2.7 detection

以下是我需要检测的图片:http://s13.postimg.org/wt8qxoco3/image.png

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

我要求你帮助的原因是因为这是一个复杂的问题,我没有能力解决它。我可能需要一周的时间来完成它。

我想到的一些伪代码:

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

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

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

通过屏幕,我的意思是在一个应用程序。我有应用程序的窗口名称和PID。

要100%清除,我需要基本上检测image1是否在image2内。 image1是我在OP中给出的图像。 image2是一个窗口的屏幕截图。

3 个答案:

答案 0 :(得分:3)

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

首先,您需要应用程序窗口的屏幕截图作为2D像素阵列。有各种不同的方法以特定于平台的方式执行此操作,但您没有提到您正在使用的平台,所以...让我们使用PIL抓住整个屏幕:

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

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

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

现在你有一个2D像素数组,你想看看它是否存在于另一个2D数组中。有更快的方法可以做到这一点 - 使用numpy可能是最好的 - 但也有一种愚蠢的蛮力方式,这很容易理解:只需迭代haystack的行;对于每一个,迭代列,看看是否找到与needle的第一行匹配的字节行。如果是这样,请继续浏览其余行,直到您完成所有needle,在这种情况下,您返回True,或发现不匹配,在这种情况下,您continue只是在下一行再次开始。

答案 1 :(得分:1)

这可能是最好的起点:

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

如果您无法访问图像的元数据,文件名,类型等,那么您尝试做的事情非常困难,但您的伪声音在点上。基本上,你必须根据照片的形状,线条,大小,颜色等创建一个算法模型,然后你必须将该模型与已经制作并在某些数据库中编制索引的模型相匹配。希望有所帮助。

答案 2 :(得分:0)

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