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>
粗々ではあるが、これでひと通り動画作成・確認ができるようになった。