MacBookで複数台のカメラを使ってみた

OpenCV on MacBook で同時に2台の1394カメラを使ってみた.」
ちょっと同期したステレオ画像が欲しくなったので,OpenCVを使って複数台のカメラを使うプログラムを書いてみた.

環境

サンプルプログラムの実行

とりあえず,1394カメラ使えんのか?と思って,2台のカメラをつないで,サンプルプログラムを動かしてみた.カメラを使うものならなんでも良いので,OpenCVのインストールパッケージにあったlkdemoを動かしてみた.

opencv-1.0.0/samples/c/lkdemo

実行すると片方のカメラの映像が出てきた.おー素晴らしい!なんかしらんが,なんもせんでも1394カメラが使えとるじゃんか!!
./configure
しても
Use dc1394 & raw1394: no
とか言われてんのに何故??
Use QuickTime / Mac OS X: yes
になってればいいのか?まぁ,とりあえず動いたので良しとする.詳しいことはあとで調べる.

サンプルプログラムを覗く

動いたので,さっそくlkdemo.cを参考に作ってみる.ソースを覗くと,こんな感じになってた.

CvCapture* capture = 0;
if( argc==1 | (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0])))
    capture = cvCaptureFromCAM( argc == 2 ? argv[1][0] - '0' : 0 );
else if( argc==2 )
    capture = cvCaptureFromAVI( argv[1] );

あー,引数でカメラ選択できるのね.aviファイルも入力できるのかぁーなるほど.とりあえず,cvCaptureFromCAMが使えそうなので,opencv.jpで調べてみる.が,無い.google code searchに聞いてみると,

#define cvCaptureFromCAM cvCreateCameraCapture

とか出てきた.なんだ,cvCreateCameraCaptureと一緒なのね.

プログラムを改造

とりあえず,なんとなく分かったので,書いてみる.
サンプルプログラムのカメラ選択部分を消して,

CvCapture *capture = 0;
capture = cvCaptureFromCAM( 0 );

とシンプルに書き直してあげる.実行すればちゃんと片方のカメラの画像が出てくる.次に2台目のカメラを指定してみる.

CvCapture *capture = 0;
capture = cvCaptureFromCAM( 1 );

実行すると,2台目のカメラの画像が,,,と思ったが,なぜかさっきと同じ1台目のカメラの画像が出てくる.むむむ?変だなー.調べてみると
OpenCV: MacbookでUSBカメラを使う - Cold Water
でも同じような事が書いてあった.参考にさせてもらって,

CvCapture *capture = 0;
capture = cvCaptureFromCAM( 0 );
capture = cvCaptureFromCAM( 1 );

とすると,お!2台目のカメラの画像が出てきた!ありがとうcoldwaterさん!

2台のカメラを同時に読み込む

で,2台同時に取り込むために,こうやって書いてあげる.

CvCapture *capture1 = 0;
CvCapture *capture2 = 0;
capture1 = cvCaptureFromCAM( 0 );
capture2 = cvCaptureFromCAM( 0 );
capture2 = cvCaptureFromCAM( 1 );

結果はダメ.これだと1394カメラとiSightになる.1394の2台目が飛ばされてる??ははーん,ということで,やっぱりこれでいけることが判明.

CvCapture *capture1 = 0;
CvCapture *capture2 = 0;
capture1 = cvCaptureFromCAM( 0 );
capture2 = cvCaptureFromCAM( 1 );

ってか,これでもいける.

CvCapture *capture1 = 0;
CvCapture *capture2 = 0;
capture1 = cvCaptureFromCAM( 0 );
capture2 = cvCaptureFromCAM( 0 );

もはやcvCaptureFromCAMの引数のindexに意味ない.順々に読み込んでいるだけということが分かった.
1394 CAM->iSight->USB CAM
の順なのかな.MacBook内蔵のiSightってたしかUSBだから,後ろの順番はどうなるか分からんけども.