【发布时间】:2020-05-24 10:02:00
【问题描述】:
我正在对大小为 800x600 的实时屏幕截图流运行神经网络。由于我只有大约 3fps,所以我进行了一些故障排除,发现每个步骤大约花费了多少时间:
- 屏幕截图:12 毫秒
- 图像处理:280ms
- 对象检测和框可视化:16 毫秒
- 显示图像:0.5ms
我正在使用 mss 截屏 (documentation)。
这是没有对象检测部分的代码:
import numpy as np
import cv2
from PIL import Image
import mss
monitor = {"top": 40, "left": 0, "width": 800, "height": 600}
with mss.mss() as sct:
while True:
# # Screenshot:
image = sct.grab(monitor)
# # Image processing:
image = Image.frombytes("RGB", image.size, image.bgra, "raw", "RGBX")
(im_width, im_height) = image.size
image_np = np.array(image.getdata()).reshape((im_height, im_width, 3)).astype(np.uint8)
# # Object detection and box visualisation:
# ...
# # Displaying image:
cv2.imshow("Object Detection", image_np)
有什么想法可以让这更快吗?
【问题讨论】:
-
如果没有需要 280 毫秒的整个“图像处理”代码,将无法为您提供帮助。
-
我在代码中添加了一些 cmets 以显示哪些行做了什么。 “图像处理:”下面的 3 行需要 280 毫秒。你是这个意思吗?
-
单独测量每一行以查明罪魁祸首:我的猜测是
Image.frombytes()是导致滞后的原因。 -
frombytes() 只需要大约 2ms,.size 需要 0.5ms。第三行导致滞后。
-
你为什么要从屏幕抓取字节制作 PIL 图像,然后从 PIL 图像中取出所有字节并列出错误的形状,然后制作一个 Numpy 数组,然后调整它的大小?您可以使用
img = np.array(sct.grab(monitor))直接获取 Numpy 数组。
标签: python-3.x numpy opencv python-imaging-library