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()処理の流れ
cap.read()で1フレーム分の画像を取得する- 戻り値の
retがFalseになったら動画の終端に達したと判断し、ループを終了する - 各フレームの画像は
cv2.imshow()で表示する(画像のときと同じ関数) - ループ終了後、
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.264 | h264 | 高画質・高圧縮率。Blu-rayや地上デジタル放送で採用 |
| H.265/HEVC | h265 | H.264の後継。4K/8K映像向け |
| MPEG-4 | mp4v | 互換性が高い。DVDなどで利用 |
| VP9 | vp90 | Google開発。YouTubeで採用 |
| MJPEG | mjpg | 静止画連続方式。監視カメラや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()によるリソースの解放を忘れない