[Raspberry Pi] OpenCVの導入とインターバル撮影

Raspberry PiにOpenCV-2.4.4aを導入しました。
OpenCVはapt-getで導入できるパッケージ版もあるようですが、現在のところバージョンが少し古いようです。
BeagleBoard+Ubuntu+ロジクール C905での経験ですが、古いバージョン(2.3ぐらい)のOpenCVでは数秒の遅延が発生する事象がありましたので、今回は最新のバージョンをソースから導入しました。
以下、導入手順です。

# apt-get -y install build-essential cmake cmake-qt-gui pkg-config libpng12-0 libpng12-dev libpng++-dev libpng3 libpnglite-dev zlib1g-dbg zlib1g zlib1g-dev pngtools libtiff4-dev libtiff4 libtiffxx0c2 libtiff-tools
# apt-get -y install libjpeg8 libjpeg8-dev libjpeg8-dbg libjpeg-progs ffmpeg libavcodec-dev libavcodec53 libavformat53 libavformat-dev libgstreamer0.10-0-dbg libgstreamer0.10-0 libgstreamer0.10-dev libxine1-ffmpeg libxine-dev libxine1-bin libunicap2 libunicap2-dev libdc1394-22-dev libdc1394-22 libdc1394-utils swig libv4l-0 libv4l-dev python-numpy libpython2.6 python-dev python2.6-dev libgtk2.0-dev pkg-config
# apt-get install libswscale-dev
# wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.4/OpenCV-2.4.4a.tar.bz2
# tar -xvjpf OpenCV-2.4.4a.tar.bz2
# cd opencv-2.4.4/
# mkdir build
# cd build
# cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_NEW_PYTHON_SUPPORT=ON -D BUILD_EXAMPLES=ON ..
# make
# make install
# ldconfig

900MHzにクロックアップした状態で、6.5時間かかりました。(私の外出中にPi君が頑張ってビルドしてくれました)
OpenCVを使ったカメラのテストとして、インターバルカメラのプログラムを作成してみました。
カメラの画像を15秒ごとにJPEGで保存するものです。
また、一連のJPEGファイルをFFMPEGで動画に変換するシェルスクリプトも紹介します。
以下はプログラムです。(camera_test.c)

#include <stdio.h>
#include <cv.h>
#include <highgui.h>
#include <ctype.h>
int main (int argc, char **argv)
{
IplImage *frame = 0;
double w = 320, h = 240;
CvCapture *capture = cvCreateCameraCapture(-1);
if (capture==NULL) {
printf("Camera not found.\n");
return 0;
}
cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, w);
cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, h);
// カメラから画像をキャプチャする
int num = 0;
char fname[1024];
while (1) {
frame = cvQueryFrame(capture);
// ファイル名
sprintf(fname, "cap%06d.jpg", num);
printf("%s\n", fname);
// ファイルに保存する
cvSaveImage(fname, frame, NULL);
sleep(15);
num++;
}
cvReleaseCapture (&capture);
return 0;
}

プログラムのコンパイル手順です。

% gcc -o camera_test camera_test.c -I/usr/local/include/opencv -lpthread -ldl -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann

以下のように実行すると、15秒毎にカメラ画像がJPEGに保存されます。

% ./camera_test

撮影間隔を変える場合はプログラムを修正するなり、引数で渡すように改造するなりしてください。
以下のスクリプトで、連続したJPEGファイルをFFMPEGでMJPEG動画に変換後、MP4動画に変換できます。(make_mov.sh)

#!/bin/sh
rm -f out.avi
ffmpeg -r 24 -i ./cap%06d.jpg -vcodec mjpeg -sameq out.avi
rm -f out.mp4
ffmpeg -i out.avi -vcodec libx264 -f mp4 out.mp4

以下のように実行します。

% ./make_mov.sh

家から見える風景を朝から夜まで撮影してみました。

Raspberry Pi とWEBカメラでインターバル撮影

このプログラムではJPEGファイルや動画ファイルをSDカード上に作成するので、常用するとSDカードの寿命が短くなる恐れがあります。常用する場合にはRAMディスクやNASに記録したりする工夫が必要だと思います。
画像に大きな変化があったら、しばらく短い周期で撮影したり、画像をメールで携帯に送信したりするなどの機能を盛り込めばセキュリティカメラになりますね。

本格派対局将棋 ぴよ将棋
本格派対局将棋アプリ ぴよ将棋
[Android] [iOS]

かわいい「ひよこ」と対局する将棋アプリ。かわいいけどAIは本格派!
対局後の検討機能や棋譜管理機能も充実!棋譜解析機能も搭載!

「[Raspberry Pi] OpenCVの導入とインターバル撮影」への3件のフィードバック

  1. こんにちは。
    いつもK-Shogiを使わせてもらっており
    大変お世話になっています。
    選手権にはもう出場されないのでしょうか?

  2. K-Shogiをお使いいただきありがとうございます。
    選手権ですが、GWはロボカップとぶつかったりしてなかなか出られない状況です。都合が合えばまた出たいと思っています。

  3. RESありがとうございます^^
    確かにGWだと色々日程の調整が大変ですよね・・・
    ずっとK-Shogiさんに練習相手をしてもらっていて
    思い入れがあるので、また出られることがあればネット越しではありますが応援させていただきます!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です