OpenCVで動画読み込み&書き込み
OpenCVのダウンロードは下記記事を参照してください。
OpenCVをC++/CLIでラップ - 何でもプログラミング
VideoCapture
動画を読み込むにはVideoCaptureクラスを利用します。
パスを指定して開き、>>オペレータでフレームを取得します。
cv::VideoCapture capture("c:\\..."); cv::Mat frame; capture >> frame;
VideoWriter
動画を出力するにはVideoWriterクラスを利用します。
パス、コーデック、fps、サイズを指定して作成し、<<オペレータでフレームを出力します。
cv::VideoWriter writer("c:\\...", fourcc, fps, cv::Size(width, height)); writer << frame;
エッジ化して出力する例
Win32コンソールアプリケーション(64bit)を想定しています。
動画は、opencvのサンプルとして付属しているMegamind.aviを利用します。(sources/samples/data/Megamind.avi)
開いた動画の情報は、VideoCaptureのget関数で色々取得できます。
作成したexeと同じフォルダにopencv_world320.dllとopencv_ffmpeg320_64.dllをコピーするのを忘れないようにしてください。
#include <opencv2\opencv.hpp> #pragma comment(lib, "opencv_world320.lib") int main() { cv::VideoCapture capture("c:\\lib\\opencv3.2\\sources\\samples\\data\\megamind.avi"); int width = (int)capture.get(CV_CAP_PROP_FRAME_WIDTH); int height = (int)capture.get(CV_CAP_PROP_FRAME_HEIGHT); int count = (int)capture.get(CV_CAP_PROP_FRAME_COUNT); int fourcc = (int)capture.get(CV_CAP_PROP_FOURCC); double fps = capture.get(CV_CAP_PROP_FPS); cv::VideoWriter writer("out.avi", fourcc, fps, cv::Size(width, height), false); while (true) { cv::Mat frame; capture >> frame; if (frame.empty()) break; cv::Mat edge; cv::Canny(frame, edge, 50, 150); writer << edge; } return 0; }
シーク
CV_CAP_PROP_POS_FRAMESでフレーム位置を指定できます。(その他ミリ秒で設定できるCV_CAP_PROP_POS_MSECなどもあります)
capture.set(CV_CAP_PROP_POS_FRAMES, 100);
H.264
上記のアプリケーションでは、H.264の読込は出来ても、書き込みはできません。
書き込みをしたい場合は、下記からopenh264-1.6.0-win64msvc.dllをダウンロードしてexeと同じフォルダに配置してください。
Releases · cisco/openh264 · GitHub