使用OpenCV和Python-2.7进行屏幕捕获

时间:2014-06-09 21:19:13

标签: python python-2.7 opencv numpy video-capture

我正在使用 Python 2.7 OpenCV 2.4.9

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

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

我需要像下面示例中所做的那样,以递归方式从网络摄像头捕获 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类来处理来自网络摄像头的捕获图像。

使用VideoCapture.read(),新帧始终被呈现并存储到 Mat 对象中。

我可以将“printscreens stream”加载到VideoCapture对象中吗?我是否可以使用Python中的OpenCV创建计算机屏幕流,而无需每秒保存和删除大量 .bmp 文件?

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

3 个答案:

答案 0 :(得分:26)

这是我用@Raoul提示编写的解决方案代码。

我使用PIL ImageGrab模块来抓取printcreen框架。

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

答案 1 :(得分:18)

我的其他解决方案存在帧速率问题,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

答案 2 :(得分:4)

这是@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")