[Python] opencvで動画を読み込む方法
PythonでOpenCVを使用して動画を読み込むには、cv2.VideoCapture()
を使います。
この関数に動画ファイルのパスを渡すことで、動画をフレームごとに読み込むことができます。
VideoCapture
オブジェクトのread()メソッド
を使って、フレームを1つずつ取得し、imshow()
で表示することが可能です。
ループを使ってフレームを連続して読み込み、waitKey()
で一定時間待機することで動画を再生できます。
OpenCVとは
OpenCV(Open Source Computer Vision Library)は、コンピュータビジョンや画像処理のためのオープンソースライブラリです。
C++で開発されており、PythonやJavaなどの言語からも利用可能です。
OpenCVは、画像や動画の解析、物体認識、顔検出、動体追跡など、さまざまな機能を提供しています。
特に、リアルタイム処理が得意で、カメラからの映像を直接処理することができるため、ロボティクスや自動運転、監視システムなど多岐にわたる分野で活用されています。
Pythonとの親和性が高く、簡単に使えるため、初心者からプロフェッショナルまで幅広いユーザーに支持されています。
動画を読み込むための準備
必要なライブラリのインストール
動画を読み込むためには、まずOpenCVライブラリをインストールする必要があります。
以下のコマンドを使用して、pipを使ってインストールできます。
pip install opencv-python
このコマンドを実行することで、OpenCVの基本的な機能が利用可能になります。
必要に応じて、追加のモジュールもインストールすることができます。
動画ファイルの準備
動画を読み込むためには、対象となる動画ファイルを用意する必要があります。
一般的な動画ファイルの拡張子には以下のようなものがあります。
拡張子 | 説明 |
---|---|
.mp4 | MPEG-4形式の動画 |
.avi | Audio Video Interleave形式 |
.mov | Apple QuickTime形式 |
.mkv | Matroska形式 |
これらの形式のいずれかの動画ファイルを用意し、プログラムがアクセスできる場所に保存しておきましょう。
動画ファイルの形式と対応フォーマット
OpenCVは多くの動画形式に対応していますが、特に以下のフォーマットが一般的に使用されます。
フォーマット | 説明 |
---|---|
AVI | 古典的な動画フォーマット |
MP4 | 高圧縮で広く使用される |
MKV | 高品質で多機能なフォーマット |
MOV | Apple製品でよく使用される |
これらのフォーマットを使用することで、OpenCVを通じて動画をスムーズに読み込むことができます。
動画ファイルの形式に注意し、適切なフォーマットを選択しましょう。
動画の読み込み方法
cv2.VideoCapture()の使い方
OpenCVで動画を読み込むためには、cv2.VideoCapture()関数
を使用します。
この関数は、動画ファイルやカメラデバイスを指定して、動画のストリームを取得するためのオブジェクトを生成します。
以下は基本的な使い方の例です。
import cv2
# 動画ファイルを指定してVideoCaptureオブジェクトを作成
video_capture = cv2.VideoCapture('動画ファイルのパス.mp4')
動画ファイルのパス指定
cv2.VideoCapture()
に渡す引数には、動画ファイルのパスを指定します。
相対パスや絶対パスを使用することができ、ファイルが存在する場所を正確に指定する必要があります。
例えば、同じディレクトリにある動画ファイルを指定する場合は、次のように記述します。
video_capture = cv2.VideoCapture('sample_video.mp4')
read()メソッドでフレームを取得する
動画からフレームを取得するには、read()メソッド
を使用します。
このメソッドは、次のフレームを読み込み、成功したかどうかを示すブール値を返します。
以下はその例です。
ret, frame = video_capture.read()
if ret:
# フレームが正常に取得できた場合の処理
print("フレームを取得しました")
else:
print("フレームの取得に失敗しました")
フレームの表示方法
取得したフレームを表示するには、cv2.imshow()関数
を使用します。
以下のコードは、フレームをウィンドウに表示する方法を示しています。
cv2.imshow('フレーム', frame)
cv2.waitKey(0) # キー入力を待つ
cv2.destroyAllWindows() # ウィンドウを閉じる
フレームのサイズやプロパティの取得
動画のフレームサイズやその他のプロパティを取得するには、get()メソッド
を使用します。
以下は、フレームの幅と高さを取得する例です。
width = int(video_capture.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(video_capture.get(cv2.CAP_PROP_FRAME_HEIGHT))
print(f"フレームの幅: {width}, 高さ: {height}")
このようにして、動画の基本的な情報を取得することができます。
これらのプロパティは、動画処理や表示の際に役立ちます。
動画の再生と制御
フレームをループで再生する
動画を再生するためには、フレームをループで取得し続ける必要があります。
以下のコードは、動画をフレームごとにループ再生する方法を示しています。
import cv2
# 動画ファイルを指定してVideoCaptureオブジェクトを作成
video_capture = cv2.VideoCapture('動画ファイルのパス.mp4')
while True:
ret, frame = video_capture.read()
if not ret:
break # フレームが取得できなかった場合、ループを終了
cv2.imshow('動画再生', frame) # フレームを表示
# 動画の再生が終了したら、リソースを解放
video_capture.release()
cv2.destroyAllWindows()
waitKey()で再生速度を調整する
cv2.waitKey()関数
を使用することで、フレームの表示間隔を調整できます。
この関数は、指定したミリ秒だけ待機し、その間にキー入力を受け付けます。
以下の例では、30ミリ秒ごとにフレームを表示しています。
while True:
ret, frame = video_capture.read()
if not ret:
break
cv2.imshow('動画再生', frame)
if cv2.waitKey(30) & 0xFF == ord('q'): # 'q'キーで終了
break
再生を途中で停止する方法
動画の再生を途中で停止するには、waitKey()
の戻り値をチェックし、特定のキーが押された場合にループを終了します。
上記の例では、’q’キーを押すことで再生を停止できます。
if cv2.waitKey(30) & 0xFF == ord('q'):
break # 'q'キーが押された場合、ループを終了
動画の終了処理とリソースの解放
動画の再生が終了したら、必ずリソースを解放する必要があります。
release()メソッド
を使用してVideoCaptureオブジェクトを解放し、destroyAllWindows()
で表示したウィンドウを閉じます。
以下はその例です。
# 動画の再生が終了したら、リソースを解放
video_capture.release() # VideoCaptureオブジェクトを解放
cv2.destroyAllWindows() # 全てのウィンドウを閉じる
これにより、メモリリークを防ぎ、プログラムが正常に終了します。
動画の再生と制御を適切に行うことで、スムーズなユーザー体験を提供できます。
動画のフレーム処理
フレームごとの画像処理
動画の各フレームに対して画像処理を行うことができます。
例えば、エッジ検出やぼかし処理など、さまざまな処理を適用することが可能です。
以下は、フレームごとにエッジ検出を行う例です。
import cv2
video_capture = cv2.VideoCapture('動画ファイルのパス.mp4')
while True:
ret, frame = video_capture.read()
if not ret:
break
# エッジ検出を適用
edges = cv2.Canny(frame, 100, 200)
cv2.imshow('エッジ検出', edges)
if cv2.waitKey(30) & 0xFF == ord('q'):
break
video_capture.release()
cv2.destroyAllWindows()
グレースケール変換
カラー画像をグレースケールに変換することで、処理が軽くなり、特定の画像処理アルゴリズムが適用しやすくなります。
以下は、フレームをグレースケールに変換する例です。
while True:
ret, frame = video_capture.read()
if not ret:
break
# グレースケール変換
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('グレースケール', gray_frame)
if cv2.waitKey(30) & 0xFF == ord('q'):
break
フレームのリサイズ
フレームのサイズを変更することで、処理速度を向上させたり、特定の解像度に合わせたりすることができます。
以下は、フレームをリサイズする例です。
while True:
ret, frame = video_capture.read()
if not ret:
break
# フレームをリサイズ
resized_frame = cv2.resize(frame, (640, 480)) # 幅640px、高さ480pxにリサイズ
cv2.imshow('リサイズされたフレーム', resized_frame)
if cv2.waitKey(30) & 0xFF == ord('q'):
break
フレームの保存方法
処理したフレームを画像ファイルとして保存することも可能です。
以下は、フレームをJPEG形式で保存する例です。
frame_count = 0
while True:
ret, frame = video_capture.read()
if not ret:
break
# フレームを保存
cv2.imwrite(f'frame_{frame_count}.jpg', frame)
frame_count += 1
video_capture.release()
cv2.destroyAllWindows()
このコードでは、各フレームをframe_0.jpg
, frame_1.jpg
のように連番で保存します。
これにより、動画の各フレームを個別の画像ファイルとして保存することができます。
カメラからのリアルタイム動画読み込み
カメラデバイスの指定方法
OpenCVを使用してカメラから動画を取得するには、cv2.VideoCapture()関数
にカメラデバイスのインデックスを指定します。
通常、最初のカメラはインデックス0で指定されます。
以下は、カメラデバイスを指定する例です。
import cv2
# カメラデバイスを指定(0は最初のカメラ)
camera_capture = cv2.VideoCapture(0)
カメラからのフレーム取得
カメラからフレームを取得するには、read()メソッド
を使用します。
このメソッドは、カメラから次のフレームを読み込み、成功したかどうかを示すブール値を返します。
以下はその例です。
while True:
ret, frame = camera_capture.read()
if not ret:
break # フレームが取得できなかった場合、ループを終了
カメラ映像のリアルタイム表示
取得したフレームをリアルタイムで表示するには、cv2.imshow()関数
を使用します。
以下のコードは、カメラからの映像をウィンドウに表示する方法を示しています。
cv2.imshow('カメラ映像', frame) # フレームを表示
if cv2.waitKey(1) & 0xFF == ord('q'): # 'q'キーで終了
break
カメラ映像の保存方法
カメラからの映像を保存するには、cv2.VideoWriter()
を使用します。
このクラスを使って、指定したフォーマットで動画ファイルに書き込むことができます。
以下は、カメラ映像をAVI形式で保存する例です。
# 動画の保存設定
fourcc = cv2.VideoWriter_fourcc(*'XVID') # コーデックの指定
output = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480)) # 出力ファイルの設定
while True:
ret, frame = camera_capture.read()
if not ret:
break
output.write(frame) # フレームを動画ファイルに書き込む
cv2.imshow('カメラ映像', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# リソースの解放
camera_capture.release()
output.release()
cv2.destroyAllWindows()
このコードでは、カメラから取得したフレームをoutput.avi
というファイル名で保存します。
コーデックやフレームレート、解像度を指定することで、保存する動画の品質を調整できます。
応用例
動画のフレームを画像として保存する
動画の各フレームを個別の画像ファイルとして保存することができます。
以下のコードは、動画のフレームをJPEG形式で保存する例です。
import cv2
video_capture = cv2.VideoCapture('動画ファイルのパス.mp4')
frame_count = 0
while True:
ret, frame = video_capture.read()
if not ret:
break
# フレームを保存
cv2.imwrite(f'frame_{frame_count}.jpg', frame)
frame_count += 1
video_capture.release()
このコードでは、各フレームをframe_0.jpg
, frame_1.jpg
のように連番で保存します。
動画のフレームにテキストや図形を描画する
動画のフレームにテキストや図形を描画することも可能です。
以下は、フレームにテキストを描画する例です。
while True:
ret, frame = video_capture.read()
if not ret:
break
# テキストを描画
cv2.putText(frame, 'Hello, OpenCV!', (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
cv2.imshow('テキスト描画', frame)
if cv2.waitKey(30) & 0xFF == ord('q'):
break
このコードでは、フレームの左上に Hello, OpenCV!
というテキストを描画しています。
動画のフレームを連結して新しい動画を作成する
複数の動画のフレームを連結して新しい動画を作成することもできます。
以下は、2つの動画を連結する例です。
video1 = cv2.VideoCapture('動画1のパス.mp4')
video2 = cv2.VideoCapture('動画2のパス.mp4')
fourcc = cv2.VideoWriter_fourcc(*'XVID')
output = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
while True:
ret1, frame1 = video1.read()
if not ret1:
break
output.write(frame1)
while True:
ret2, frame2 = video2.read()
if not ret2:
break
output.write(frame2)
video1.release()
video2.release()
output.release()
このコードでは、2つの動画を連結してoutput.avi
という新しい動画ファイルを作成します。
動画の一部を切り出して保存する
動画の特定の部分を切り出して新しい動画として保存することもできます。
以下は、動画の最初の10秒を切り出して保存する例です。
video_capture = cv2.VideoCapture('動画ファイルのパス.mp4')
fourcc = cv2.VideoWriter_fourcc(*'XVID')
output = cv2.VideoWriter('cut_output.avi', fourcc, 20.0, (640, 480))
frame_count = 0
while True:
ret, frame = video_capture.read()
if not ret or frame_count >= 200: # 10秒(20fps × 10秒 = 200フレーム)
break
output.write(frame)
frame_count += 1
video_capture.release()
output.release()
このコードでは、最初の10秒間のフレームをcut_output.avi
として保存します。
動画のフレームレートを変更する
動画のフレームレートを変更することで、再生速度を調整することができます。
以下は、フレームレートを変更して新しい動画を作成する例です。
video_capture = cv2.VideoCapture('動画ファイルのパス.mp4')
fourcc = cv2.VideoWriter_fourcc(*'XVID')
output = cv2.VideoWriter('output_30fps.avi', fourcc, 30.0, (640, 480))
while True:
ret, frame = video_capture.read()
if not ret:
break
output.write(frame)
video_capture.release()
output.release()
このコードでは、元の動画のフレームを30fpsで新しい動画として保存します。
フレームレートを変更することで、動画の再生速度を調整できます。
まとめ
この記事では、OpenCVを使用して動画を読み込む方法や、カメラからリアルタイムで映像を取得する手法について詳しく解説しました。
また、動画のフレーム処理や応用例として、フレームの保存、描画、連結、切り出し、フレームレートの変更など、さまざまな技術を紹介しました。
これらの知識を活用することで、実際のプロジェクトにおいて動画処理を効果的に行うことができるでしょう。
ぜひ、実際にコードを試してみて、OpenCVの機能を体験してみてください。