OpenCV-Python:OpenCVのIIGUI機能
5本のビデオ
目標
•ビデオファイルの読み取り、ビデオの表示、およびビデオファイルの保存の 学習•
カメラからのビデオの取得と表示の
学習•次の関数について学習します:cv2.VideoCapture()、cv2.VideoWrite()
5.1カメラでビデオをキャプチャする
リアルタイムの画像をキャプチャするには、カメラを使用する必要があることがよくあります。OpenCVは、このアプリケーションに非常にシンプルなインターフェイスを提供します。カメラを使用してビデオをキャプチャし、表示用にグレースケールビデオに変換してみましょう。この簡単なタスクから始めましょう。
ビデオを取得するには、VideoCaptureオブジェクトを作成する必要があります。彼のパラメータは、デバイスのインデックス番号またはビデオファイルにすることができます。デバイスインデックス番号は、使用するカメラを指定するためのものです。一般的なラップトップコンピュータにはカメラが内蔵されています。したがって、パラメータは0です。1などに設定して他のカメラを選択できます。その後、フレームごとにビデオをキャプチャできます。しかし、結局のところ、ビデオのキャプチャを停止することを忘れないでください。
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
# Our operations on the frame come here
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Display the resulting frame
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
cap.read()はブール値(True / False)を返します。読み取られたフレームが正しい場合、それはTrueです。したがって、最終的には、戻り値を確認することで、ビデオファイルが最後に到達したかどうかを確認できます。
キャップがカメラデバイスを正常に初期化できない場合があります。この場合、上記のコードはエラーを報告します。cap.isOpened()を使用して、初期化が成功したかどうかを確認できます。戻り値がTrueの場合、問題はありません。それ以外の場合は、関数cap.open()を使用します。
関数cap.get(propId)を使用して、ビデオのパラメーター情報を取得できます。ここで、propIdは0から18までの任意の整数にすることができます。各番号はビデオの属性を表しています。下の表を参照してください
これらの値の一部はcap.set(propId、value)を使用して変更でき、valueは設定する新しい値です。
たとえば、cap.get(3)とcap.get(4)を使用して、各フレームの幅と高さを確認できます。
デフォルトで取得される値は640X480です。ただし、ret = cap.set(3,320)およびret = cap.set(4,240)を使用して、幅と高さを320X240に変更できます。注:プログラムでエラーが報告された場合、最初に確認する必要があるのは、カメラが他のプログラム(LinuxのCheeseなど)で正常に動作するかどうかです。
5.2ファイルからビデオを再生する
カメラからのキャプチャと同様に、デバイスのインデックス番号をビデオファイルの名前に変更するだけで済みます。各フレームを再生するときは、cv2.waiKey()を使用して適切な期間を設定します。設定が低すぎるとビデオの再生が非常に速くなり、設定が高すぎるとビデオの再生が非常に遅くなります(この方法を使用してビデオの速度を制御できます)。通常、25ミリ秒で十分です。
import numpy as np
import cv2
cap = cv2.VideoCapture('vtest.avi')
while(cap.isOpened()):
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
注:適切なバージョンのffmpegまたはgstreamerがインストールされていることを確認する必要があります。間違えると頭痛の種になります。
5.3ビデオを保存する
ビデオをキャプチャして各フレームを処理した後、ビデオを保存します。絵が来たら、それは非常に単純で、cv2.imwrite()を使用するだけです。しかし、ビデオの場合は、さらに多くの作業を行う必要があります。
今回は、VideoWriterオブジェクトを作成します。出力ファイルの名前を決定する必要があります。次に、FourCCコード(以下で説明)を指定します。再生周波数とフレームサイズも決定する必要があります。最後はisColorタグです。Trueの場合、各フレームはカラー画像です。それ以外の場合は、グレースケール画像です。
FourCCは、ビデオのエンコード形式を決定するために使用される4バイトのコードです。利用可能なコードのリストはfourcc.orgにあります。これはプラットフォームに依存します。次のエンコーダーは私にとって便利です。
•Fedoraの場合:DIVX、XVID、MJPG、X264、WMV1、WMV2。(XVIDの方が望ましい。MJPGは大きいサイズのビデオになります。X264は非常に小さいサイズのビデオになります)
•Windowsの場合:DIVX(さらにテストおよび追加)
• OSX :(私はOSXにアクセスできません。誰かがこれを埋めることができますか?)
FourCCコードは、MJPGを例として、次の形式でプログラムに渡されます。
cv2.cv.FOURCC( 'M'、 'J'、 'P'、 'G')またはcv2.cv.FOURCC(* 'MJPG')。
次のコードは、カメラからビデオをキャプチャし、各フレームを水平方向に回転させて保存します。
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
frame = cv2.flip(frame,0)
# write the flipped frame
out.write(frame)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()
詳細については、公式アカウントに注意してください。