5

複数のウェブカメラから同時に(またはほぼ同時に)画像をキャプチャしようとしています。私はOpenCVVideoCaptureと Python でのプログラミングで遊んでいます。しかし、混乱があり、誰かが物事を説明するのを手伝ってくれることを願っています...

まず、VideoCapture を試してみました (Markus Gritsch の作品はhttp://videocapture.sourceforge.net/にあります)。これは非常に使いやすい Python 用のアドインです。シンプルな画像をキャプチャしたいだけの場合。それはうまく機能します...ほとんどの場合。

私のセットアップは、単一の USB ポートの USB ハブにある 2 つの安価な Web カメラと、ラップトップの内蔵 Web カメラです。

同じ USB バスで同じモデルのウェブカメラを使用し、それがどのように機能しないかなどについてすべて読みましたが、試してみることにしました。(「Cyber​​link YouCam」という何十年も前にインストールしたはずのフォトブース プログラムもあります。何らかの理由で、このプログラムは OpenCV と VideoCapture の両方にとってカメラのように「見えます」。

VideoCapture は、次のように各カメラに接続してキャプチャします。

Cam0 = Device(devnum=0)
Cam0.saveSnapshot("filename0.jpg")
del Cam0
Cam1 = Device(devnum=1)
Cam1.saveSnapshot("filename1.jpg")
del Cam1

VideoCapture と説明したセットアップを使用すると、システム上のすべてのカメラから個別にキャプチャできます (YouCam を含めて合計 4 つ... 0 - 3)

問題は、このプログラムが同時に複数のカメラに接続できないように見えることです...前のカメラ インスタンスを閉じないと、フリーズするだけで、最初の Web カメラを切断して再接続する必要があります。 USB からアクセスを回復します。

これはうまくいきません:

cam0 = Device(devnum=0)
cam1 = Device(devnum=1)
cam0.saveSnapshot("filename0.jpg")
cam1.saveSnapshot("filename1.jpg")
del cam0
del cam1

Cam0 が開きますが、それで終わりです。凍った。

VideoCapture のもう 1 つの点は、安価な Web カメラでは、画像が生き生きするまでに大きな遅延 (ほぼ 1 秒) があることです... キャプチャを成功させるには、次のようなことをしなければなりませんでした:

Cam1 = Device(devnum=1)
Cam1.saveSnapshot("filename1.jpg") #gets the camera going and saves black image
time.sleep(.75) #delay
Cam1.saveSnapshot("filename1.jpg") #captures the image second time around

画像を効果的に2回保存しています...

各カメラからの画像が数ミリ秒間隔で順番に撮影されていても気にしませんでした

#open connection to cam, take image
#close connection to cam

#connect to next cam, take next image
#close connection to cam

#etc.

しかし、遅延が大きすぎました...遅延は安価なWebカメラだと思っていましたが、Open CVで別の結果が見られたので、VideoCaptureのせいに違いありません.

1 つには、OpenCV を使用して同時に複数のカメラを開くことができました...ただし、種類が異なるだけです。(チープカムの 1 つと内蔵カム... および/または Cyber​​link プログラム) OpenCV は、同じ USB ハブ上の 2 つのチープカムを 1 つとして認識しているように見えました (カムの 1 つだけをオンにしました。)

capture0 = CaptureFromCAM(0) #this was Cyberlink Program
capture1 = CaptureFromCAM(1) #this was cheapo cam
capture2 = CaptureFromCAM(2) #this was built-in cam
#CaptureFromCAM(3) resulted in error... did not find a 4th "camera"

frame0 = QueryFrame(capure0)
frame1 = QueryFrame(capure1)
frame2 = QueryFrame(capure2)
cv.SaveImage("filename0.jpg",frame0)
cv.SaveImage("filename1.jpg",frame1)
cv.SaveImage("filename2.jpg",frame2)

VideoCapture は 2 つの同様のカメラを個別に見ることができましたが、OpenCV はできませんでした。

それがなぜだろうと誰でも知っていますか?2 つのパッケージは、同じ USB 上の異なるカムを判別でき、もう 1 つは判別できないという、コンピューターとの対話方法がどのように異なるのでしょうか?

第二に、OpenCV は私の安価なカムを即座に開きました...そこでは 0.75 秒の遅延はありませんでした。

繰り返しますが、2 つのパッケージ (videoCapture と OpenCV) がカメラとどのように通信するかについて、私は興味があります。

私が最終的に興味を持っているのは、2 台または 3 台のカメラから同時にキャプチャできるようにすることです (または、数ミリ秒の遅延があった場合は、それに近い状態で問題ありません)。OpenCV が最適なパッケージのように見えますが、ソフトウェアがカメラとどのように相互作用しているかをよりよく理解しようとしています。

洞察力をありがとうございました!

J

4

5 に答える 5

0

OpenCVに関する情報をいくつかお伝えできますが、VideoCapture に関する情報はお伝えできません。ただし、適切なカメラ名を取得するために VideoCapture を使用しています。

Python で OpenCV を使用して、同時に 2 台のカメラと正常に通信しました。場合によっては、2 台のカメラが異なっていたり、同じであるが科学的レベルだったりした場合は、ドライバーの方が優れていた可能性があります。同一のカメラを 2 台使用しても問題がないとは言えません。

ただし、古い、おそらくメンテナンスされていないカメラ APIを使用していると言えます。VideoCapture と呼ばれる新しいcv2名前空間/APIを使用します。で始まるOpenCV VideoCapture クラスのpython バインディングを参照してください。Python ディストリビューションに新しいバージョンの OpenCV がある場合は、. 古いバインディングは にあります(また、OpenCV 2.4.6 の時点で、およびの重要な定数の多くはにしか存在しないことに注意してください。これは、次のバージョンで修正される予定です)cv2import cv2cv2.cvVideoCapture::get(...)::set(...)cv2.cv

于 2013-11-13T03:28:01.490 に答える
0

これは USB 帯域幅の問題だと思います。圧縮が組み込まれていない Web カメラは、膨大な量の帯域幅を使用します。カメラの解像度の幅 * 高さに色深度 (たとえば、256 色の場合は 8 ビット) をフレーム レートで掛けて、1 秒あたりのビット数を取得します (USB フレーミングのオーバーヘッドなし)。単一の USB2 高速 (480 メガビット/秒) チャネルでは、複数の HD ストリーム (1280 * 1024 * 8 * 30 fps ~= 314.6 メガビット/秒) を伝送できません。ハブを使用する場合、その帯域幅はすべてのポートで共有されます。ドライバーがカメラを開こうとすると、帯域幅要件が読み取られ、USB チャネルの残りの帯域幅が不十分な場合は続行が拒否されます。そのため、最初に開いたカメラは機能しますが、その後のカメラは失敗します。あなたの選択は、低解像度のカメラを使用することです。

于 2016-08-18T15:26:25.477 に答える