在 OpenCV 中从桌面获取输入流

Posted

技术标签:

【中文标题】在 OpenCV 中从桌面获取输入流【英文标题】:Take an input stream from the desktop in OpenCV 【发布时间】:2016-09-03 12:02:36 【问题描述】:

我正在使用 Python 3.5.1OpenCV 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 中从桌面获取输入流的主要内容,如果未能解决你的问题,请参考以下文章

获取压缩文件的输入流?

JAVA:已知获取文件的输出流ouputStream,怎么转换为文件

Azure 流分析获取前一个输出行以加入输入

从类路径资源(XML 文件)获取输入流

如何在字符串缓冲区输入循环之外获取http请求的输入流结果

8hutool实战:FileUtil 文件工具类(获取输入流)