ITや趣味など気軽に投稿しています。

【Python】OpenCVで動画を読み込み、表示・保存する

OpenCVでは画像だけでなく動画も扱うことができます。動画ファイルの読み込みはもちろん、USBカメラやネットワークカメラからのリアルタイム映像の取得も可能です。

動画は画像の連続(フレームの連なり)です。そのため、処理の基本単位は1フレーム(=1枚の画像)であり、画像処理と同じ関数を活用できます。

この記事では、cv2.VideoCapture()による動画の読み込みとcv2.VideoWriter()による動画の保存方法を解説します。

動画の読み込み

動画ファイルを読み込む

動画ファイル(.mp4など)の読み込みにはcv2.VideoCapture()を使用します。引数にファイルパスを指定します。

import cv2

path = 'input/Aquarium.mp4'
cap = cv2.VideoCapture(path)

USBカメラから動画を読み込む

PCに接続されたUSBカメラや内蔵カメラの映像を取得する場合、引数にデバイスID(数値)を指定します。

import cv2

cap = cv2.VideoCapture(0)

デバイスIDは0から順に割り振られます。複数のカメラが接続されている場合は、0、1、2…と変更して目的のカメラを指定してください。

注意: WindowsではデバイスIDを確認する公式の手段がないため、0から順に試す必要があります。

ネットワークカメラから動画を読み込む

ネットワーク越しに接続されたカメラの映像は、RTSPプロトコルを使って取得するケースが一般的です。

import cv2

# URLは環境に応じて変更してください
cap = cv2.VideoCapture("rtsp://user:password@192.168.10.1:47614/ipcam_h264.sdp")

ユーザー名、パスワード、IPアドレス、ポート番号はカメラの設定に合わせて変更してください。

動画を表示する

動画の表示は、whileループ内で1フレームずつ画像を読み出し、cv2.imshow()で表示します。

import cv2

path = r'input/Aquarium.mp4'
cap = cv2.VideoCapture(path)

i = 1
while True:
    print("Frame: " + str(i))
    # フレーム情報取得
    ret, img = cap.read()
    # 動画が終われば処理終了
    if ret == False:
        break
    # 動画表示
    cv2.imshow('Video', img)
    i += 1

cap.release()
cv2.destroyAllWindows()

処理の流れ

  1. cap.read()で1フレーム分の画像を取得する
  2. 戻り値のretFalseになったら動画の終端に達したと判断し、ループを終了する
  3. 各フレームの画像はcv2.imshow()で表示する(画像のときと同じ関数)
  4. ループ終了後、cap.release()でカメラリソースを解放する

重要: cap.release()を呼ばないと、他のアプリケーションからカメラにアクセスできなくなる可能性があります。必ず記述してください。

動画を出力する

動画をファイルとして保存するにはcv2.VideoWriter()を使用します。

import cv2

path = r'./input/Aquarium.mp4'
cap = cv2.VideoCapture(path)

# 動画サイズ取得
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# フレームレート取得
fps = cap.get(cv2.CAP_PROP_FPS)

# フォーマット指定
fmt = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')

# VideoWriterの作成(グレースケール出力の場合は第5引数に0を指定)
writer = cv2.VideoWriter('./result/output.mp4', fmt, fps, (width, height), 0)

i = 1
while True:
    print("Frame: " + str(i))
    ret, img = cap.read()
    if ret == False:
        break
    # グレースケールに変換
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 動画表示
    cv2.imshow('Video', img_gray)
    # 動画書き込み
    writer.write(img_gray)
    i += 1

cap.release()
writer.release()
cv2.destroyAllWindows()

VideoWriter_fourcc()

VideoWriter_fourcc()で動画のフォーマット(コーデック)を指定します。fourccは、データフォーマットを一意に識別するための4文字の識別子(four-character code)です。

コーデックFourCC説明
H.264h264高画質・高圧縮率。Blu-rayや地上デジタル放送で採用
H.265/HEVCh265H.264の後継。4K/8K映像向け
MPEG-4mp4v互換性が高い。DVDなどで利用
VP9vp90Google開発。YouTubeで採用
MJPEGmjpg静止画連続方式。監視カメラやWebカメラで利用
fmt = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')

cv2.VideoWriter()

cv2.VideoWriter()の引数に、出力ファイルパス、フォーマット、フレームレート、フレームサイズを指定します。グレースケール映像を出力する場合は第5引数に0を指定します。

writer = cv2.VideoWriter('./result/output.mp4', fmt, fps, (width, height), 0)

whileループ内でwriter.write()により1フレームずつ書き込み、最後にwriter.release()で出力を完了します。

まとめ

今回は、OpenCVで動画を読み込み・表示・保存する方法を紹介しました。

  • 読み込み: cv2.VideoCapture()でファイル・USBカメラ・ネットワークカメラに対応
  • 表示: whileループ内でcap.read()cv2.imshow()を使用
  • 保存: cv2.VideoWriter()でフレームごとに書き込み
  • cap.release()writer.release()によるリソースの解放を忘れない