danglingfarpointer's memoization

仕事周りでの気付き、メモ、愚痴などを書いていきます。

Raspberry Pi - OpenCVで動画のread/write

前回のエントリと同様、Raspberry Pi + OpenCV関連。

今回は、

  • Web Camのキャプチャから動画を作成するプログラム
  • その動画を再生するプログラム(動画確認用)

を作ってみた。

1. Web Cam.

前回と同様、LogitechのC270というWeb Camを接続。

2. FFmpeg

FFmpegをインストールしておく。

sudo apt-get install ffmpeg

3. 動画作成

3-1. ソース

writer.cpp:

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
    VideoCapture cap(0);
    if(!cap.isOpened())
        return -1;

    // 320x240
    cap.set(CV_CAP_PROP_FRAME_WIDTH, 320);
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 240);

    string filename = argc > 1 ? string(argv[1]) + ".avi" : "test.avi";
    int codec = CV_FOURCC('F', 'M', 'P', '4'); // use MP4 as video codec
    VideoWriter writer(filename, codec, 20, Size(320, 240), true);

    Mat image;
    namedWindow("video", CV_WINDOW_AUTOSIZE);
    while(true){
        cap >> image;
        if (image.empty())
            break;

        imshow("video", image);

        writer << image;
        if(waitKey(50) >= 0)
            break;
    }
}

コンテナとして".avi", 動画コーデックとしてfmp4を利用する。OpenCVでは、サポートされているコンテナは".avi"のみとのこと。動画のfpsは20を指定。

3-2. コンパイル・実行

g++ writer.cpp `pkg-config --libs opencv` -o writer
./writer # または、./writer <filename>

実行時にいろいろとwarningがでるものの、動画ファイルが作成される。引数無しで実行した場合のファイル名は、test.avi.

4. 動画再生

Raspberry Piではmplayerなどで動画を再生できる。しかし、上記のプログラムで作った動画は、fpsをいろいろと調整してもなぜか速く再生されてしまう。解決方法もよくわからないので、再生部分もOpenCVで用意しておくことにした。

4-1. ソース

reader.cpp:

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
    string filename = argc > 1 ? argv[1] : "test.avi";
    VideoCapture cap(filename);
    if(!cap.isOpened())
        return -1;

    // read fps from the video to coordinate the video play speed
    int fps = cap.get(CV_CAP_PROP_FPS);
    int wait = 1000 / fps;

    Mat image;
    namedWindow("video", CV_WINDOW_AUTOSIZE);
    while(true){
        cap >> image;
        if (image.empty())
            break;

        imshow("video", image);

        if(waitKey(wait) >= 0)
            break;
    }
}

4-2. コンパイル・実行

g++ reader.cpp `pkg-config --libs opencv` -o reader
./reader # または、./reader <filename>

粗々ではあるが、これでひと通り動画作成・確認ができるようになった。