从桌面获取OpenCV的输入流

9

我正在使用Python 3.5.1OpenCV 3.0.0

我正在开发一个可以玩游戏的Python程序,因此需要“看到”屏幕上发生的事情。如何实现这一点?

import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
    #work with frames here

有没有一个整数'a',可以使cv2.VideoCapture(a)将桌面屏幕作为视频输入?我尝试了一种比较笨拙的方法,重复使用以下代码来捕获屏幕:

import os
os.system('screencapture test.jpg')

然后使用cv2.imread打开test.jpg。这是一个非常缓慢的方法,在网上搜索时,我发现了这个问题:Screen Capture with OpenCV and Python-2.7可以做同样的事情,但效率更高。但事实仍然是它捕获单个截图并逐一处理它们,而不是真正的视频流。我还找到了如何在OpenCV中捕获桌面(即将位图转换为Mat)?,我认为这就接近我尝试的东西了,但它是用C++编写的,如果有人可以帮我将其转换为Python,我将非常感激。
主要问题是程序将执行类似MarI/O的操作,因此速度是个问题,任何帮助都将不胜感激,请对我好点,我(相对而言)刚开始接触OpenCV。
谢谢。

你找到任何东西了吗? - DanMossa
我找到了这个网站,http://sikulix.com/,听起来很有前途,但我从未尝试过。如果你尝试了,请告诉我一声。 - Divyanshu Kalra
2个回答

1
在单独的线程中截取屏幕截图是一个不错的解决方案。您还可以使用虚拟摄像头,但这是一个比较繁重的解决方案。或者您可以通过使用ffmpeg直接捕获桌面。https://trac.ffmpeg.org/wiki/Capture/Desktop

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,您可以创建一个单独的线程来拍摄截图,同时让主线程处理帧。您可以将截图放入队列中,这样主线程只需读取下一帧而无需等待I/O操作。 - nathancy

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