[Python] opencvで動画を読み込む方法

PythonでOpenCVを使用して動画を読み込むには、cv2.VideoCapture()を使います。

この関数に動画ファイルのパスを渡すことで、動画をフレームごとに読み込むことができます。

VideoCaptureオブジェクトのread()メソッドを使って、フレームを1つずつ取得し、imshow()で表示することが可能です。

ループを使ってフレームを連続して読み込み、waitKey()で一定時間待機することで動画を再生できます。

この記事でわかること
  • OpenCVを使った動画の読み込み方法
  • フレームごとの画像処理技術
  • カメラからのリアルタイム映像取得
  • 動画のフレームを保存する方法
  • 応用例を通じた実践的な活用法

目次から探す

OpenCVとは

OpenCV(Open Source Computer Vision Library)は、コンピュータビジョンや画像処理のためのオープンソースライブラリです。

C++で開発されており、PythonやJavaなどの言語からも利用可能です。

OpenCVは、画像や動画の解析、物体認識、顔検出、動体追跡など、さまざまな機能を提供しています。

特に、リアルタイム処理が得意で、カメラからの映像を直接処理することができるため、ロボティクスや自動運転、監視システムなど多岐にわたる分野で活用されています。

Pythonとの親和性が高く、簡単に使えるため、初心者からプロフェッショナルまで幅広いユーザーに支持されています。

動画を読み込むための準備

必要なライブラリのインストール

動画を読み込むためには、まずOpenCVライブラリをインストールする必要があります。

以下のコマンドを使用して、pipを使ってインストールできます。

pip install opencv-python

このコマンドを実行することで、OpenCVの基本的な機能が利用可能になります。

必要に応じて、追加のモジュールもインストールすることができます。

動画ファイルの準備

動画を読み込むためには、対象となる動画ファイルを用意する必要があります。

一般的な動画ファイルの拡張子には以下のようなものがあります。

スクロールできます
拡張子説明
.mp4MPEG-4形式の動画
.aviAudio Video Interleave形式
.movApple QuickTime形式
.mkvMatroska形式

これらの形式のいずれかの動画ファイルを用意し、プログラムがアクセスできる場所に保存しておきましょう。

動画ファイルの形式と対応フォーマット

OpenCVは多くの動画形式に対応していますが、特に以下のフォーマットが一般的に使用されます。

スクロールできます
フォーマット説明
AVI古典的な動画フォーマット
MP4高圧縮で広く使用される
MKV高品質で多機能なフォーマット
MOVApple製品でよく使用される

これらのフォーマットを使用することで、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がサポートしている動画形式(.mp4, .avi, .movなど)であるか確認します。
  • コーデックの確認: 使用している動画ファイルが必要なコーデックでエンコードされているか確認します。

コーデックが不足している場合、動画が読み込めないことがあります。

  • OpenCVのインストール: OpenCVが正しくインストールされているか確認します。

必要に応じて再インストールを行ってください。

特定のフレームだけを取得する方法は?

特定のフレームを取得するには、VideoCaptureオブジェクトのset()メソッドを使用して、フレーム番号を指定します。

以下のように記述します。

video_capture.set(cv2.CAP_PROP_POS_FRAMES, フレーム番号)
ret, frame = video_capture.read()

このコードを使用することで、指定したフレーム番号のフレームを取得することができます。

例えば、10フレーム目を取得したい場合は、フレーム番号に10を指定します。

カメラが認識されない場合の原因は?

カメラが認識されない場合、以下の原因が考えられます。

  • カメラの接続: USBカメラの場合、正しく接続されているか確認します。

接続が不十分な場合、カメラが認識されないことがあります。

  • デバイスインデックスの確認: cv2.VideoCapture()で指定するデバイスインデックスが正しいか確認します。

複数のカメラが接続されている場合、インデックスを変更してみてください。

  • ドライバのインストール: カメラのドライバが正しくインストールされているか確認します。

必要に応じて、最新のドライバをインストールしてください。

  • 他のアプリケーションの使用: 他のアプリケーションがカメラを使用している場合、OpenCVがカメラにアクセスできないことがあります。

カメラを使用しているアプリケーションを終了してから再試行してください。

まとめ

この記事では、OpenCVを使用して動画を読み込む方法や、カメラからリアルタイムで映像を取得する手法について詳しく解説しました。

また、動画のフレーム処理や応用例として、フレームの保存、描画、連結、切り出し、フレームレートの変更など、さまざまな技術を紹介しました。

これらの知識を活用することで、実際のプロジェクトにおいて動画処理を効果的に行うことができるでしょう。

ぜひ、実際にコードを試してみて、OpenCVの機能を体験してみてください。

  • URLをコピーしました!
目次から探す