web-dev-qa-db-ja.com

OpenCVとPython-2.7を使用したスクリーンキャプチャ

Python 2.7およびOpenCV 2.4.9を使用しています。

ユーザーに表示されている現在のフレームをキャプチャし、cv ::マット Pythonのオブジェクト。

あなたは再帰的にそれを行う高速な方法を知っていますか?

次の例で行われているような、キャプチャするものが必要ですマットウェブカメラからのフレームを再帰的に:

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クラスを使用して、Webカメラからキャプチャした画像を操作します。

VideoCapture.read()を使用すると、常に新しいフレームが読み込まれ、 マット オブジェクト。

"printscreens stream"をVideoCaptureオブジェクトにロードできますか? PythonのOpenCVを使用して、多くの。bmpファイル/秒を保存および削除することなく、コンピューターの画面のストリーミングを作成できますか?

このフレームが必要です マット オブジェクトまたは NumPy配列、したがって、このフレームを使用してリアルタイムでいくつかのコンピュータービジョンルーチンを実行できます。

15
Renan V. Novas

これは、@ Raoulのヒントを使用して作成したソリューションコードです。

PIL ImageGrabモジュールを使用して、printscreenフレームを取得しました。

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
29
Renan V. Novas

私は他のソリューションでフレームレートの問題がありました 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
20
Neabfi