使用PIL(Python Image Library)在屏幕上检测图像

10
我想了解如何在Python 2.7中使用PIL搜索整个屏幕并单击某个图像。我已经进行了搜索,但没有找到解决方案。我想创建一个小型GUI,其中只有一个按钮位于中心,在单击该按钮时将搜索预定义图像的整个屏幕。一旦找到图像,程序将在其中心单击并结束。简而言之,程序将检测用户屏幕上是否存在图像,并单击它。
我确实发现了Sikuli的一些有趣内容,但这对我没有帮助,因为它无法导出为.exe文件。
程序将查找的图像很可能每次都在同一位置,但我不想硬编码该位置,因为它可能会移动,我不希望以后出现问题。
我需要的是用于在屏幕上搜索图像并将坐标发送回变量的代码方法。
图像说明/示例: Image 步枪的参考图像: Image2

屏幕上的图像与参考图像大小相同还是不同? - Sainath Motlakunta
是的,它会有所不同。大致上相同大小。 - Freddie
查找准确图像很容易。查找相似图像需要图像识别算法,并且难度相对较大。 - Gabe
不,每次都会是完全相同的图像。我展示了步枪,因为我还没有制作另一个。 - Freddie
即使是相同的图像,如果大小不同,也可能需要更复杂的算法来处理,这将是一项困难的任务。 - Sainath Motlakunta
这是按钮应该看起来的样子 http://i.imgur.com/y8X7shb.png。这个图像是一个常量,不会改变其大小或外观,只会在屏幕上改变位置。 - Freddie
3个回答

11
PIL不适合这项工作,您应该考虑使用openCV(开源计算机视觉),它具有出色的Python绑定。以下链接是一个示例(用C语言编写,但使用Python绑定很容易重做),可以完成您要求的操作,并允许旋转、缩放等操作。 http://docs.opencv.org/doc/tutorials/features2d/feature_homography/feature_homography.html http://docs.opencv.org/doc/tutorials/features2d/detection_of_planar_objects/detection_of_planar_objects.html 编辑: 我猜您正在使用Windows,因为您的示例图像看起来像Windows。在这种情况下,您可以使用:
from PIL import ImageGrab
pil_img = ImageGrab.grab()
opencv_img = numpy.array(pil_img)

然后使用OpenCV来处理图像,以查找您要查找的子图像。

如果您想跨平台执行此操作,则需要使用wxWidgets进行屏幕截取:https://dev59.com/7nE85IYBdhLWcg3wSxgv#10089645


我正在尝试从程序窗口外部检测图像。它需要能够搜索整个屏幕。 - Freddie
以上回答已经进行了修正。 - Kyle
1
你能详细说一下我该如何使用它来搜索屏幕吗?我遇到了真正的问题。 - Freddie
OpenCV的链接似乎现在已经失效了。 - Reedinationer

3

我也想使用不同的模块——pyautogui来实现相同的功能。最终,我找到了解决方案,并确信这个解决方案也能帮助你。 你只需要进入这个网页,完整地阅读“定位函数”一章,就可以解决问题了。


嗨,Yashas P B,欢迎!请尽可能提供完整的解释,而不仅仅是链接 - 这些是论坛的指导方针 :) - loved.by.Jesus
1
好的,我下次一定会解释清楚。这是我第一次回答问题,所以谢谢你。 - I Answer StackOvrFlw questions

1
我建议您看一下PyAutoGUI,这是一个文档完备的库,可以控制鼠标和键盘,还可以定位屏幕上的图像,找到位置,在任何位置移动鼠标并单击位置,还可以模拟拖放、在输入字段中输入、进行双击等等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接