在 OpenCV 中从桌面获取输入流
Posted
技术标签:
【中文标题】在 OpenCV 中从桌面获取输入流【英文标题】:Take an input stream from the desktop in OpenCV 【发布时间】:2016-09-03 12:02:36 【问题描述】:我正在使用 Python 3.5.1 和 OpenCV 3.0.0。
我正在开发一个可以玩游戏的 Python 程序,因此它需要在屏幕上“查看”正在发生的事情。如何做到这一点?
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
#work with frames here
是否有一个 int 'a' 使得 cv2.VideoCapture(a) 将桌面屏幕作为视频输入?我尝试制作它,但我采用了一种相当笨拙的方法,我反复使用以下方法捕获屏幕:
import os
os.system('screencapture test.jpg')
然后使用 cv2.imread 打开 test.jpg。这是一种非常缓慢的方法,在网上搜索时我发现了这个问题Screen Capture with OpenCV and Python-2.7,它做同样的事情,但效率更高。但事实仍然是它正在捕获单个屏幕截图并逐个处理它们,而不是真正的视频流。我还发现了这个How to capture the desktop in OpenCV (ie. turn a bitmap into a Mat)?,我认为它与我正在尝试的很接近,但它是用 C++ 编写的,如果有人可以帮助我将它转换为 Python,我将不胜感激。
主要是该程序将执行MarI/O 之类的操作,因此速度是一个问题,感谢任何帮助,放轻松,我是(相对)OpenCV 新手。
谢谢。
【问题讨论】:
你找到什么了吗? 我确实找到了这个,sikulix.com 听起来很有希望,但从未真正尝试过。如果你这样做,请告诉我。 【参考方案1】:只是对此问题的更新,以防有人需要解决方案。
使用模块pyautogui
可以实现截图
import pyautogui
import matplotlib.pyplot as plt
image = pyautogui.screenshot()
plt.imshow(image)
如果你想以流的形式阅读,
while(True):
image = pyautogui.screenshot()
#further processing
if finished:
break
根据文档,
在 1920 x 1080 的屏幕上,screenshot() 函数大约需要 100 毫秒
因此,如果您的应用程序不要求高 fps 速率,则可以使用此解决方案。
【讨论】:
为了进一步提高 FPS,您可以创建一个单独的线程仅用于截屏,同时让主线程处理帧。您可以将屏幕截图放入队列中,以便主线程无需等待 I/O 操作即可读取下一帧。【参考方案2】:在单独的线程中截取屏幕截图听起来不错。 您也可以使用虚拟网络摄像头,但这是一个繁重的解决方案。 或者您可以使用 ffmpeg 直接捕获桌面。 https://trac.ffmpeg.org/wiki/Capture/Desktop
【讨论】:
以上是关于在 OpenCV 中从桌面获取输入流的主要内容,如果未能解决你的问题,请参考以下文章