FFmpeg(libavformat,libavcodec,libswscale)ライブラリで動画ファイルを読み込み、各映像フレームをOpenCVライブラリのcv::Mat
型へ変換するまでの雛形コード。
- よくみかけるFFmpeg映像復号サンプルコードはコーデック遅延(
CODEC_CAP_DELAY
)に対応しないものが多く、一部の映像コーデックでは入力映像ストリームの末尾数フレームが欠損する。av_read_frame
がファイル終端到達後のavcodec_decode_video2
空パケット通知により正しく対応。 - FFmpegサポート有りOpenCVビルドでも同じことを実現できるが、
cv::VideoCapture
だと常にRGB色空間に変換されてしまう。動画系コーデックはYUV色空間ネイィブが主流のため、無駄な色空間変換コストを抑えたい場合に便利(かもしれない)。 -
cv::Mat image
のデータ領域はvector<uint8_t> framebuf
を参照しているだけなので、次フレーム処理時には破壊されていることに注意。複数フレームを保持する必要がある場合は、コピーしたcv::Mat
を退避しておくこと。