【发布时间】:2014-06-02 13:22:32
【问题描述】:
我创建了一个简单的 Python 脚本,只要特定程序运行,它就会被激活。该程序将信息发送到屏幕,脚本需要抓取和分析这些信息。
脚本的部分逻辑可以表示如下:
while a certain condition is met:
function to continuously check pixel information on a fixed area of the screen()
if pixel data (e.g. RGB) changes:
do something
else:
continues to check
我已经找到了可以做到这一点的东西,但没有我想要的那么快。 这是一个使用具有任意值的 Python Imaging Library (PIL) 的解决方案:
import ImageGrab
box = (0,0,100,100) # 100x100 screen area to capture (0x0 is top left corner)
pixel = (60,20) #target pixel coordenates (must be within the box's boundaries)
im = ImageGrab.grab(box) #grabs the image area (aka printscreen) -> source of bottleneck
hm = im.getpixel(pixel) # gets pixel information from the captured image in the form of an RGB value
然后我可以获取该 RGB 值并将其与函数获得的先前值进行比较。如果它发生了变化,那么屏幕上发生了一些事情,这意味着程序做了一些事情,因此脚本可以相应地运行。 然而,脚本需要快速反应,特别是因为这只是一个更大的函数的一部分,它有自己的复杂性和缺陷,所以我正在一点一点地优化代码,从这个。
此解决方案在 i7 4770k cpu 上将脚本限制为每秒约 30 次迭代。看起来很快,但是将它与其他功能一起添加,这些功能本身以类似的速度解析像素信息,并且事情开始累加。我的目标是在单个函数上每秒至少进行 200 次迭代,也许是 150 次迭代,以便最终脚本可以每秒运行 5-10 次迭代。
那么,长话短说:还有什么其他方法可以更快地解析屏幕上的像素?
【问题讨论】:
-
Python 不是这项工作的工具。实时图形处理需要更强大的语言,如 C++。即使您不受处理代码性能的限制,在大多数窗口系统上抓取屏幕的一部分也是一项缓慢的操作。
-
@Daniel Shaw:看看这个问题:stackoverflow.com/questions/1997678/…
-
@nightcracker 好吧,这只是......令人沮丧。肯定有一种方法可以至少更快一点。
-
@DanielShaw 不是来自 Python。您最终将调用特定于 C API 的操作系统代码来加速抓取屏幕的一部分,虽然这在 Python 中使用
ctypes可能,但它基本上是伪装的 C。在 Python 中稍微缺乏一些好的库,但我认为主要原因是因为无论如何你都无法在 Python 中快速处理生成的屏幕抓取。 -
@BenjaminGolder 该解决方案的迭代速度为 48-52 次/秒。所以快了 60%,这是一个开始,但我一直在寻找至少一个数量级的差异(我这样不合理:()
标签: python image-processing python-imaging-library pixels