2012年10月8日月曜日

Raspberry Pi への OpenCV インストール

こちらに改めてセットアップに関して記述しています。

 相変わらず、GR-SAKURA のI2Cが上手く扱えず、Arduinoを主力で行くか悶々としている日々が続いているのですが、気分転換に Raspberry Pi へ OpenCV のインストールを行なってみました。Raspberry Piで画像処理が出来れば、センサやサーボ制御周りはロボット上のArduinoにやらせて、コントローラまでロボットに載せてしまいたいときはRaspberry Piを一緒に載せて、リモートブレイン的にいくときはBluetooth等の無線経由でパソコンで処理といった選択肢が広がります。そうなると、自分の知識ではI2C(のライブラリが他のArduinoやRaspberry Piと同じようにやっても)を思ったように動かせないGR-SAKURAの出番はますますなくなっていくわけですが・・・。

 当初、日本語で解説されているこちらのページを参考にさせていただいて、
   OpenCV-2.4.2.tar.bz2
のインストールを行ったんですがmakeで 3~4件のErrorが出てしまい、数日かけて色々試してみたんですが、結局サンプルも動かせない状態でした。
 そこで、こちらのページを参考にして、マイナーバージョンの一つ古い
   OpenCV-2.3.1a.tar.bz2
というのを試したら、あっさりインストールできてしまいました。おそらく、Raspberry Pi の Rapbian "wheezy" が古いバージョンを使っていることに起因しているんじゃないかと思います。う~ん、インストールするだけで数日かかってしまった。Windows ならこのへんのバージョン(まして、マイナーバージョン)なんてほとんど問題にならない、っていうか、何も考えずにダブルクリックだけで済んじゃうわけで、そういうところはやっぱり便利です(というか、それが当たり前だと思ってしまっていますが)。
 で、とりあえず、pythonのサンプルを動かしてみる。



 動くようです。これで、なんとか環境だけは準備できたかな?でも、ロボットで使うとなると大事なのはカメラが使えるかというところだと思います。Windowsなら、何も考えずにUSBに挿せば勝手にドライバーが入って(あるいは簡単なインストールで)動いてしまうわけですが、Linuxだとそうも行かないことは予想がつきます。カメラ側にLinux対応と買いて売っているものもまずありません。この辺りに有志の方の動作確認済み情報もありますが、日本で手に入りにくかったり、ロボットに載せるのに向いていなさそうなタイプのものだったりで、リストにあるLogitechのものを一つ買ってみようとは思っていますが、とりあえず、手元に在庫として転がっている(過去に使っていて今使っていないような)古いWebCamを試しに挿して動作を確認して見ることにしました。Logitechの昔のものなら、それなりに動く期待はもてるんじゃないかと・・・。
 で、カメラ自体の動作確認にはまずOpenCVとは別に guvcview というソフトを
     sudo apt-get install guvcview
でインストールして、行いました。

Logitech V-UM27 (100mA)
   lsusb では 046d:08f0 Logitech, Inc. QuickCam Messenger とリストされる。
   ls /dev 以下に vidio0 としてリスト。
   ls /dev/v4l/by-id/ では usb-046d_Camera-video-index0 としてリスト
   guvcview では 1fps, 160×120res, YU12 で動作。
   形的には目玉っぽくてロボットにいいかも。下部にネジ穴もあるので固定しやすそう。

Logitech V-US20 (100mA)
   lsusb では 046d:0870 Logitech, Inc. QuickCam Express とリストされる。
   ls /dev 以下に vidio0 としてリストされず。
   使えず。


Logitech V-UJ15 (100mA)
   lsusb では 046d:08b1 Logitech, Inc. QuickCam Notobuook Pro とリストされる。
   ls /dev 以下に vidio0 としてリスト。
   ls /dev/v4l/by-id/ では usb-0464_08b1-video-index0 としてリスト
   guvcview では 9.5fps, 160×120res, YU12 で動作。
   解像度も低く、ロボットに載せにくい形状。



Logitech V-UBU48 (500mA)
   lsusb では 046d:0991 Logitech, Inc. QuickCam Pro for Notebooks とリストされる。
   ls /dev 以下に vidio0 としてリスト。
   ls /dev/v4l/by-id/ では usb-046d_030E2026-video-index0 としてリスト
   guvcview では MJPEG, YUYV等で 160×120res, 3fps ~ 320×240 ~640×480 ~ 800×600, 1fps 等で動作。
   画質もクリアで使えそうだが、Rating:500mAって記述が気になる。Raspberry Pi のUSBは140mAくらいのポリスイッチ(リセッタブルヒューズ)が入っているらしい。


ELECOM UCAM-DLK130T (詳細不明、UVC)
   lsusb では 056e:700f Elecom Co. Ltd とリストされる。
   ls /dev 以下に vidio0 としてリスト。
   ls /dev/v4l/by-id/ では usb-ELECOM_ELECOM_UCAM-DLK130T-video-index0 としてリスト
   guvcview では YUYVで 160×120res,7fpsと320×240.5fpsと800×600,0.5fpsで動作。
   なぜかVGA解像度で動かなかった。ロボットに載せるのには加工が大変そう。



とりあえず、認識されてv4lで画像が取得できた、Logitech V-UM27、V-UJ15、V-UBU48、ELECOM UCAM-DLK130Tで OpenCVのカメラ画像取得を試してみました。といっても、OpenCVをいじるのは初めてなので、ネットでサンプルコードなどを拾ってきてお試ししました。

// OpenCV カメラ画像取得テスト。
#include <stdio.h>
#include <ctype.h>
#include <time.h>
#include <sys/time.h>
#include <unistd.h>

#include <opencv/highgui.h>

int main(int argc, char **argv)
{
 CvCapture *capture = 0;
 IplImage *frame = 0;
 int c;
 
 //double width = 160, height = 120;
 double width = 320, height = 240;
 //double width = 640, height = 480;
 //double width = 800, height = 600;
 
 // カメラに対するキャプチャ構造体を作成。
 if (argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0])))
  capture = cvCreateCameraCapture(argc == 2 ? argv[1][0] - '0' : 0);
 
 // キャプチャサイズの設定。
 cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, width);
 cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, height);
 
 // ウィンドウ作成。
 cvNamedWindow("Capture", CV_WINDOW_AUTOSIZE);
 
 while(1)
 {
  // 画像キャプチャ。
  frame = cvQueryFrame(capture);
  cvShowImage("Capture", frame);
  
  c = cvWaitKey(2);
  if(c == '\x1b') break;
  //sleep(2);
 }
 
 // 後片付け。
 cvReleaseCapture(&capture);
 cvDestroyWindow("Capture");
 
 return 0;
}

 とりあえず、それぞれのカメラで(対応している解像度で)の画像取得を確認できました。


 ただ、実際にOpenCVを使っての画像処理に関しては、全くこれからの初心者状態ですので、すこしずつ調べながら進めていきたいと思っています。