UVC対応カメラを複数台つなげるときは帯域に注意する

2 台の Web カメラを繋げて、次のプログラムを実行します。

/* 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 台でも大丈夫そうですね。このハブには、無線マウスとキーボードが繋がっていますが、普通に動いています。

カテゴリー: 開発, C++, OpenCV パーマリンク

UVC対応カメラを複数台つなげるときは帯域に注意する への1件のコメント

  1. ugambow のコメント:

    先日100均でUVCカメラを複数台入手し、同時使用してみようと思ったら認識できず(別管轄?のポートであれば認識する)、競合しているのかと思っていたのですが、帯域の問題ですか。
    もしかすると解決できる情報に遭遇できてよかったです。今は、使用していた環境が不安定で、超低性能な別環境しかないですが確認してみようと思います。

コメントは停止中です。