2 台の Web カメラを繋げて、次のプログラムを実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | /* OpenCV 2.3 でビルドする */ #include <iostream> #include "opencv/cv.h" #include "opencv/highgui.h" using namespace std; int main( int argc, char **argv ) { cv::VideoCapture cap1, cap2; cap1.open(0); cap2.open(1); /* USB の転送量が間に合わないのでサイズを 320x240 に変更する */ /* USB ボードを変えると、640x480 でも ok ? */ cap1.set( CV_CAP_PROP_FRAME_WIDTH, 320 ); cap1.set( CV_CAP_PROP_FRAME_HEIGHT, 240 ); cap2.set( CV_CAP_PROP_FRAME_WIDTH, 320 ); cap2.set( CV_CAP_PROP_FRAME_HEIGHT, 240 ); cv::namedWindow( "camera1" , CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO); cv::namedWindow( "camera2" , CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO); while ( 1 ) { cv::Mat img1, img2; cap1 >> img1 ; cap2 >> img2 ; cv::imshow( "camera1" , img1 ); cv::imshow( "camera2" , img2 ); char ch = cv::waitKey(30); if ( ch == 27 ) break ; } return 0; } |
結論から言えば、UVC 対応の WEB カメラを複数台つなげることができます。
実は、最初なかなかつながらなくて、AMCAP(DirectShowのサンプル)を動かしても認識しないし、片方を止めれば片方が認識するし、なぜか、3台繋いだ状態でも、同時には1台しか表示させることができない…ってな訳で、半日ほど悩みました。
複数接続させた例は、Linux だったり、何故だろう、Windows 7 では動かないのか?とか。
で、あれこれと調べた挙句。
AOISAKURA – 日記(2010-07-25)
http://www.aoisakura.jp/tdiary/?date=20100725
なところで、「帯域」の話があったので、なるほど USB の帯域の問題であったか orz ということです。
高速にキャプチャする場合には、帯域が被らないように USB ボードを買えばよいのですが、まぁ、そこまで掛けるのもアレなので、できるだけ遠くにある(かな?)USB ポートに差せば大丈夫でした…なんだかなぁ。
解像度を 640×480 にすると、片方の画像がみだれてたり、片方が止まってしまったりします。この現象もあちこちのブログであったので、おそらく帯域の問題でしょう。USB 2.0 の場合、最初の接続がシビアになっているので、なんか接続できない場合は、他のプログラムでひとつずつカメラを繋げてみて、その後、複数台に接続するとうまくいきます。
当然、USB ハブを通した場合は、ハブの性能に引きずられるのでハブを通さないほうがよいかと。USB 機器が繋がっている場合には、外して試してみるとか。現状、320×240 では 2 台でも大丈夫そうですね。このハブには、無線マウスとキーボードが繋がっていますが、普通に動いています。
先日100均でUVCカメラを複数台入手し、同時使用してみようと思ったら認識できず(別管轄?のポートであれば認識する)、競合しているのかと思っていたのですが、帯域の問題ですか。
もしかすると解決できる情報に遭遇できてよかったです。今は、使用していた環境が不安定で、超低性能な別環境しかないですが確認してみようと思います。