OpenCV 5.0.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 5.0.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
動画の基本操作

目的

  • 動画の読み込み、表示、保存を学ぶ。
  • カメラからビデオを取り込んで表示する方法を学ぶ。
  • 次の関数を学ぶ : cv.VideoCapture(), cv.VideoWriter()

カメラから動画をキャプチャする

しばしば、カメラでライブ映像をキャプチャしなければならない。OpenCVはこれを行うための非常にシンプルなインタフェースを提供する。カメラから動画をキャプチャし(私はノートPCの内蔵ウェブカメラを使っている)、それをグレースケール動画に変換して表示してみよう。手始めにちょうどよい簡単な作業である。

動画をキャプチャするには、VideoCaptureオブジェクトを作成する必要がある。その引数はデバイスのインデックスか動画ファイルの名前のいずれかである。デバイスインデックスは、どのカメラを指定するかを示す単なる番号である。通常はカメラが1台接続されている(私の場合のように)。そこで単純に0(または-1)を渡す。1を渡せば2台目のカメラを選択でき、以降同様である。その後、フレームごとにキャプチャできる。ただし最後に、キャプチャの解放を忘れないこと。

import numpy as np
import cv2 as cv
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
# Capture frame-by-frame
ret, frame = cap.read()
# if frame is read correctly ret is True
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
# Our operations on the frame come here
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# Display the resulting frame
cv.imshow('frame', gray)
if cv.waitKey(1) == ord('q'):
break
# When everything done, release the capture
cap.release()
Class for video capturing from video files, image sequences or cameras.
Definition videoio.hpp:790
void imshow(const String &winname, InputArray mat)
Displays an image in the specified window.
int waitKey(int delay=0)
Waits for a pressed key.
void destroyAllWindows()
Destroys all of the HighGUI windows.
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0, AlgorithmHint hint=cv::ALGO_HINT_DEFAULT)
Converts an image from one color space to another.

cap.read()はブール値(True/False)を返す。フレームが正しく読み込まれればTrueになる。したがって、この戻り値を確認することで動画の終端をチェックできる。

ときに、capがキャプチャを初期化できていないことがある。その場合、このコードはエラーを表示する。初期化されているかどうかはcap.isOpened()メソッドで確認できる。Trueなら問題ない。そうでなければcap.open()を使って開く。

cap.get(propId)メソッドを使って、この動画のいくつかの特性にアクセスすることもできる。ここでpropIdは0から18までの番号である。各番号は動画の特性を表す(その動画に適用可能な場合)。詳細はここで確認できる: cv::VideoCapture::get()。これらの値の一部はcap.set(propId, value)を使って変更できる。valueは設定したい新しい値である。

例えば、フレームの幅と高さはcap.get(cv.CAP_PROP_FRAME_WIDTH)cap.get(cv.CAP_PROP_FRAME_HEIGHT)で確認できる。デフォルトでは640x480になる。しかしこれを320x240に変更したい。ret = cap.set(cv.CAP_PROP_FRAME_WIDTH,320)ret = cap.set(cv.CAP_PROP_FRAME_HEIGHT,240)を使えばよい。

覚え書き
エラーが出る場合は、他のカメラアプリケーション(Linuxでは Cheese など)を使ってカメラが正常に動作していることを確認すること。

ファイルから動画を再生する

ファイルから動画を再生するのは、カメラからキャプチャするのと同じで、カメラのインデックスを動画ファイル名に変えるだけである。また、フレームを表示する際にはcv.waitKey()に適切な時間を指定する。短すぎると動画が非常に速くなり、大きすぎると動画が遅くなる(まあ、これはスローモーションで動画を表示する方法でもある)。通常の場合は25ミリ秒で問題ない。

import numpy as np
import cv2 as cv
cap = cv.VideoCapture('vtest.avi')
while cap.isOpened():
ret, frame = cap.read()
# if frame is read correctly ret is True
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
cv.imshow('frame', gray)
if cv.waitKey(1) == ord('q'):
break
cap.release()
覚え書き
適切なバージョンのffmpegまたはgstreamerがインストールされていることを確認すること。ときにビデオキャプチャの扱いは頭痛の種になるが、それはたいていffmpeg/gstreamerの誤ったインストールが原因である。

動画を保存する

さて、動画をキャプチャしてフレームごとに処理し、その動画を保存したいとする。画像の場合は非常に簡単で、cv.imwrite()を使うだけである。ここでは、もう少し作業が必要である。

今回はVideoWriterオブジェクトを作成する。出力ファイル名(例: output.avi)を指定する必要がある。次にFourCCコード(詳細は次の段落)を指定する。続いて1秒あたりのフレーム数(fps)とフレームサイズを渡す。そして最後はisColorフラグである。Trueの場合、エンコーダはカラーフレームを期待し、そうでなければグレースケールフレームを扱う。

FourCCは、動画コーデックを指定するために使われる4バイトのコードである。利用可能なコードの一覧はfourcc.orgで見つかる。これはプラットフォーム依存である。次のコーデックは私の環境で問題なく動作する。

  • Fedoraでは: DIVX, XVID, MJPG, X264, WMV1, WMV2。(XVIDがより好ましい。MJPGは動画サイズが大きくなる。X264は非常に小さいサイズの動画になる)
  • Windowsでは: DIVX(さらに検証・追加予定)
  • OSXでは: MJPG (.mp4), DIVX (.avi), X264 (.mkv)。

FourCCコードは、MJPGの場合 ‘cv.VideoWriter_fourcc('M’,'J','P','G')または cv.VideoWriter_fourcc(*'MJPG')` のように渡す。

以下のコードは、カメラからキャプチャし、各フレームを垂直方向に反転して、動画を保存する。

import numpy as np
import cv2 as cv
# Define the codec and create VideoWriter object
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
frame = cv.flip(frame, 0)
# write the flipped frame
out.write(frame)
cv.imshow('frame', frame)
if cv.waitKey(1) == ord('q'):
break
# Release everything if job is finished
cap.release()
out.release()
Video writer class.
Definition videoio.hpp:1077
void flip(InputArray src, OutputArray dst, int flipCode)
Flips a 2D array around vertical, horizontal, or both axes.