当前位置: 首页 > 知识库问答 >
问题:

使用OpenCV和Python-2.7捕获屏幕

洪飞龙
2023-03-14

我正在使用Python 2.7和OpenCV 2.4。9

我需要捕获显示给用户的当前帧,并将其加载为Python中的cv::Mat对象。

你们知道一种快速递归的方法吗?

我需要像下面的例子中所做的那样,从网络摄像头递归地捕获Mat帧:

import cv2

cap = cv2.VideoCapture(0)
while(cap.isOpened()):
    ret, frame = cap.read()
    cv2.imshow('WindowName', frame)
    if cv2.waitKey(25) & 0xFF == ord('q'):
        cap.release()
        cv2.destroyAllWindows()
        break

在本例中,它使用了VideoCapture类来处理从网络摄像头捕获的图像。

用视频捕捉。read()新帧总是被读取并存储到Mat对象中。

我可以将“打印屏幕流”加载到视频捕获对象中吗?我可以用Python中的OpenCV创建计算机屏幕的流媒体,而不必保存和删除大量数据。每秒bmp文件数?

我需要这个帧是Mat对象或NumPy数组,所以我可以用这个帧实时执行一些计算机视觉例程。

共有3个答案

柯波
2023-03-14

这是@Neabfi回答的更新答案

import time

import cv2
import numpy as np
from mss import mss

mon = {'top': 160, 'left': 160, 'width': 200, 'height': 200}
with mss() as sct:
    # mon = sct.monitors[0]
    while True:
        last_time = time.time()
        img = sct.grab(mon)
        print('fps: {0}'.format(1 / (time.time()-last_time)))
        cv2.imw('test', np.array(img))
        if cv2.waitKey(25) & 0xFF == ord('q'):
            cv2.destroyAllWindows()
            break

并保存到MP4视频

import time

import cv2
import numpy as np
from mss import mss


def record(name):
    with mss() as sct:
        # mon = {'top': 160, 'left': 160, 'width': 200, 'height': 200}
        mon = sct.monitors[0]
        name = name + '.mp4'
        fourcc = cv2.VideoWriter_fourcc(*'mp4v')
        desired_fps = 30.0
        out = cv2.VideoWriter(name, fourcc, desired_fps,
                              (mon['width'], mon['height']))
        last_time = 0
        while True:
            img = sct.grab(mon)
            # cv2.imshow('test', np.array(img))
            if time.time() - last_time > 1./desired_fps:
                last_time = time.time()
                destRGB = cv2.cvtColor(np.array(img), cv2.COLOR_BGRA2BGR)
                out.write(destRGB)
            if cv2.waitKey(25) & 0xFF == ord('q'):
                cv2.destroyAllWindows()
                break


record("Video")

储承
2023-03-14

我有帧速率问题与其他解决方案,mss解决他们。

import numpy as np
import cv2
from mss import mss
from PIL import Image

mon = {'top': 160, 'left': 160, 'width': 200, 'height': 200}

sct = mss()

while 1:
    sct.get_pixels(mon)
    img = Image.frombytes('RGB', (sct.width, sct.height), sct.image)
    cv2.imshow('test', np.array(img))
    if cv2.waitKey(25) & 0xFF == ord('q'):
        cv2.destroyAllWindows()
        break
梁昊天
2023-03-14

这是我用@Raoul技巧编写的解决方案代码

我使用PIL ImageGrab模块来抓取打印屏幕帧。

import numpy as np
from PIL import ImageGrab
import cv2

while(True):
    printscreen_pil =  ImageGrab.grab()
    printscreen_numpy =   np.array(printscreen_pil.getdata(),dtype='uint8')\
    .reshape((printscreen_pil.size[1],printscreen_pil.size[0],3)) 
    cv2.imshow('window',printscreen_numpy)
    if cv2.waitKey(25) & 0xFF == ord('q'):
        cv2.destroyAllWindows()
        break
 类似资料:
  • 问题内容: 我正在使用 Python 2.7 和 OpenCV 2.4.9 。 我需要捕获显示给用户的当前帧,并将其作为 cv :: Mat 对象加载到Python中。 你们知道递归的快速方法吗? 我需要类似下面示例中的操作,该操作以递归方式从网络摄像头捕获 _ Mat_ 帧: 在示例中,它使用了 VideoCapture类 来处理从网络摄像头捕获的图像。 通过VideoCapture.read(

  • 本文向大家介绍使用Python和OpenCV捕获鼠标单击事件,包括了使用Python和OpenCV捕获鼠标单击事件的使用技巧和注意事项,需要的朋友参考一下 使用的模块: 在本文中,我们将使用Python-openCV(cv2)和NumPy模块。 Python-opencv(cv2): Python-opencv(cv2)是一个python库,它将帮助我们解决开源计算机视觉问题。 NumPy: Nu

  • 我尝试用全高清分辨率的罗技C920摄像头捕捉视频。它提供30 fps与此分辨率。 它以30 fps的速度与windows摄像头应用程序配合使用,但无论我如何尝试,我都无法通过opencv videoCapture获得这种fps速度。 注意:我使用windows 10和vs15。我尝试了不同的usb端口,opencv版本和编解码器。结果是相同的,〜5 fps。 我测量fps忽略前10帧。下面是我的计

  • 我试图根据用户输入的坐标捕捉区域截图。基本上,用户在屏幕上点击得到x,y坐标,然后在其他地方点击另一对x,y坐标,然后将其放入一个矩形中,并使用机器人库创建屏幕截图。 我有的问题是,我得到了随机截图,这不是用户输入的坐标,我怎么能考虑包括0的坐标,因为矩形值必须超过1。 以下是我迄今为止的代码:

  • 我正试图用java设计一个程序,定期(每100毫秒左右)拍摄我的屏幕截图,并计算整个屏幕的平均像素rgb值。我需要这个来处理视频游戏和iTunes/Quicktime视频。然而,我曾尝试使用JNA和robot来捕获屏幕,它只在我没有捕获全屏或iTunes视频的视频游戏时起作用。例如,我通过保存一个图像来测试代码,以检查并查看发生了什么。当我玩电子游戏时,我只看到一个空白窗口的截图。我认为这是因为游

  • 我正在尝试通过使用open CV连接cp plus ip camera到我的应用程序。我试了很多方法来捕捉画面。帮助我捕捉帧使用“RTSP”协议。IP cam的URL是“rtsp://admin:admin@192.168.1.108:554/videoinput/1/mpeg4/1”。我用VLC播放器试过这个。起作用了。如果有方法通过libvlc捕获帧并传递到open CV中,请提及该方法。