DIYの祭典、Maker Faire Tokyo 2013に行ってきました。
Maker Faire Tokyo 2013は11月3日~4日にかけて、お台場の日本科学未来館とタイム24ビルで開催されました。
面白い展示がとてもたくさんありましたが、その中でも特に気になったものを紹介します。
続きを読む Maker Faire Tokyo 2013に行ってきました
「ロボット・電子工作・マイコン」カテゴリーアーカイブ
全方位カメラを作ってみた(その2)
前回はUSBカメラにロジクールC905を使用しました。このカメラにはオートフォーカス機能が付いているのですが、Windowsではオートフォーカスが効きますが、Raspberry Pi(raspbian)ではオートフォーカス機能が効かずピントが合いませんでした。どうも、カメラからステンレス半球までの距離(約5cm)でピントが合わないといけないようです。反射率の高い鏡ならカメラから鏡までの距離と鏡から対象までの距離でピントが合えばよいようなのですが、ステンレス半球の反射率が低いせいかもしれないと想像しています。実はRaspberry Piの専用カメラでも試してみたのですが、固定フォーカス(焦点距離:1 m から無限遠)のため、やはりピントが合いませんでした。
今回、フォーカスを手動で調整できるELECOM UCAM-DLA200HBK (現時点:¥1,445)を購入して試してみました。
結果、WindowsだけでなくRaspberry Pi(raspbian)でもうまくピントが合いました!
画質などカメラとしての性能はロジクールC905の方が上ですが、Raspberry Piで動かしたいので、このカメラを使って画像認識などしてみたいと思います。
LPC1114FN28でmbed
ARMベースの32bitマイコンLPC1114FN28で、mbedの開発環境が使えるようになったとのことで試してみました。
詳細は「Getting started with mbed LPC1114」にて。
作成したプログラムの書き込み方法は上記サイトにも記載されている通りいくつかありますが、手順が簡単ということで、mbed経由でLPC1114FN28へ書き込む「イカ醤油ポッポ焼き」を使用してみました。
mbedでプロジェクトを作成した時にサンプルとして書かれているLチカプログラムをそのままコンパイルして書き込んでみました。
最初、mbed compilerの右上に表示されているプラットフォームがmbed LPC1768のままになっており、書き込みはできるものの動かなかったのですが、プラットフォームをLPC1114FN28に変更したら、動くようになりました。
手前がLPC1114FN28で、奥が書き込みに使用したmbed LPC1768です。
mbed LPC1768とはピン数も異なりますし、いろいろ制約はあるようですが、これは簡単便利です。
LPC1114FN28はトランジスタ技術の2012年10月号に付録になったことで一時期話題になりました。DIPパッケージなので、ブレッドボードや電子工作で気軽に使用できます。2013年9月現在、秋月電子にて¥110で販売されており、コストパフォーマンスが抜群に良いので、注目していましたが、開発環境の敷居が高く、なかなか手を出せないでいました。mbedの開発環境が使えるようになったことでその問題もクリアし、すばらしく使えるマイコンに昇格したと思います。自分の中ではこれまでArduinoでやっていたことは今後はLPC1114FN28を使うことになりそうです。
全方位カメラを作ってみた
[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に記録したりする工夫が必要だと思います。
画像に大きな変化があったら、しばらく短い周期で撮影したり、画像をメールで携帯に送信したりするなどの機能を盛り込めばセキュリティカメラになりますね。