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を退避しておくこと。