2016-01-30 14 views
5

少なくとも15fps以上で、画面の全部または一部のフレームを連続的に取り込むための方法がPython(多分OpenCVまたはPILを使用している)にありますか?私はそれが他の言語で行われていることを見てきました。したがって理論的には可能でなければなりません。Pythonで画面からビデオデータをキャプチャする

イメージデータをファイルに保存する必要はありません。私はちょうどそれを取って大きなLEDディスプレイ(おそらくそれをサイズ変更した後に)に送るつもりだから、実際には生のRGBデータを含む配列を出力したい(numpy配列など)。

+0

http://stackoverflow.com/a/24213099/1832058 – furas

答えて

6

枕(PIL)ライブラリからImageGrabを使用し、キャプチャをnumpy配列に変換する必要があります。あなたが配列を持っているときは、opencvを使ってそれをどうすることもできます。キャプチャを灰色に変換し、デモンストレーションとしてimshow()を使用しました。

from PIL import ImageGrab 
import numpy as np 
import cv2 

img = ImageGrab.grab(bbox=(100,10,400,780)) #bbox specifies specific region (bbox= x,y,width,height *starts top-left) 
img_np = np.array(img) #this is the array obtained from conversion 
frame = cv2.cvtColor(img_np, cv2.COLOR_BGR2GRAY) 
cv2.imshow("test", frame) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

あなたは、フレームをキャプチャ保つために喜ば周波数であり、配列を差し込むことができます。ここでは

はあなたが始めるために迅速なコードです。その後、フレームをデコードします。ループの前に追加することを忘れないでください:

fourcc = cv2.VideoWriter_fourcc(*'XVID') 
vid = cv2.VideoWriter('output.avi', fourcc, 6, (640,480)) 

、あなたが追加することができ、ループ内:

vid.write(frame) #the edited frame or the original img_np as you please 

あなたが達成したい場合はUPDATE
最終結果はこのようなものを(見てキャプチャされた画面にopencvを使用するデモだけのビデオとして保存する):

from PIL import ImageGrab 
import numpy as np 
import cv2 
while(True): 
    img = ImageGrab.grab(bbox=(100,10,400,780)) #bbox specifies specific region (bbox= x,y,width,height) 
    img_np = np.array(img) 
    frame = cv2.cvtColor(img_np, cv2.COLOR_BGR2GRAY) 
    cv2.imshow("test", frame) 
    cv2.waitKey(0) 
cv2.destroyAllWindows() 

役に立ったと思っています

+0

あなたは何を意味わからない:「あなたはあなたに喜ば周波数であり、配列をプラグインすることができますフレームを捕捉し続ける "...配列どこに?そして私はビデオ出力をまったく行う必要はありません...スクリーン上でどこをつかむかを指定する方法はありますか? –

+0

私は、スクリーンキャプチャのストリームを持っている間に追加すると言っていた。今コードを編集します。特定の領域使用bboxパラメータを指定するためのものです。 1分更新します – ibininja

+0

さらに変更を加えました。希望は助けます – ibininja

13

mssには、はるかに優れたフレームレートを提供するソリューションがあります。 (MacOSのシエラでのMacBook Proでテスト)

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 
+0

私は** ValueErrorを取得します:十分な画像データ** Image.frombytes – ypicard

+0

とi7 2600kを使用すると、私は1440pモニターを記録するときに8fpsしか得られません。 – NullVoxPopuli

関連する問題