2013年9月16日月曜日

Raspberry Pi camera モジュールでOpenCV (引き続きVisualGDBお試し中)

 Raspberry Pi の専用カメラモジュールを入手して、本体に取り付けて、コマンドで画像取得はできたんですが、OpenCVで使おうと思ったら、他のUSB Webcamの様にはOpenCVでは認識してくれませんでした。
 "raspistill"コマンドのソースが公開されているので、それらを解析して、画像取得部分を取り出さないとダメなのかなぁ?面倒だなぁ?なんて躊躇している間に、世の中にはさっさとやってくれている人がいらっしゃいました。他力本願ですが、こちらのサイトで公開されている資料やソースをそのままコピー&ダウンロードして、使わせて頂くことにしました。
 ただ、開発環境の方は、先日から評価版インストールでお試し中のVisualGDBです。頂いてきたソースをそのままWindows上のViisualGDBのプロジェクトに登録して、Makefile settingsの部分を環境に合わせて(include,libのパスと使用するlibの設定)、SSH接続でのRaspberry Pi上でのコンパイルで実行してみました。

 プロジェクトの構成はこんな感じ。


 Makefileの設定。


 includeパス。


 libraryパス。


 library。


で、ビルドして実行してみました。


 サンプルはOpenCVのcvWindowで画像を表示して、ファイルfoobar.bmpに保存するような内容ですが、その通りの動作(当たり前か?)です。実際のOpenCVのコードが書かれている部分をステップ実行で探したところ、camcv.c の encoder_buffer_callback関数内で行われていました。1フレームのデータが取得されてエンコードされたあとに呼び出されるような関数でしょうか?その中でOpenCVの処理を行っています。この部分に顔検出やらそのほかのOpenCVの処理を追加していけばいいのだと思うのですが、raspstillコマンドのソースを元にしているためもあって、全体のコードがやりたいことに対して大きくなってしまいますね。もう少しシンプルにcameraモジュールを使う方法があるといいんですけど。他のUSB webcamみたいにOpenCVで扱えるといいんですが・・・。
 なんか、この感じだと、専用cameraモジュールを使うよりもUSB webcam使ったほうが、Raspberry Piから少し離れたところへの引き回しや固定(専用cameraモジュールは15cmくらいのリボンケーブルで基板むき出し)しやすいし、ソフトウェア的にもOpenCVが素直に認識してくれれば(最近のUSB webcamならUVC対応で、たいがい認識してくれるだろう)、全然楽な気がしてきました。う~ん、使い道が・・・。