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;
}

f:id:any-programming:20170307202225p:plain

シーク

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

ライセンス関係

ffmpegにはLGPL版とGPL版があり、デフォルトで配布されているopencv_ffmpeg320_64.dllはLGPL版のものになります。(そのためH.264の出力ができず、openH264を利用する形となっています。)

また、dllのライセンス以外に、H.264の利用料があります(MPEG-LA)

openH264は、利用しているアプリをインストールする際にdllをダウンロードするようにすれば、利用料は肩代わりすると書かれています。

ややこしいことを避けたい場合は、OSが提供しているAPI(Media Foundationなど)を利用するのがよいと思います。