[表紙頁]へ  関連記事の目次へ

[2017年7月6日]
USBカメラ6台切替プログラムを、改善・修正

先日、「USBカメラ4台切替方式」のプログラムを作成したが、これをカメラ6台に増設している間に、外部カメラを繋いだDELL D430機で試運転中に、プログラムが頻繁にダウンする状況になって来た。長くて1時間以内、短い時は数分でダウン!(図2<クリック>
というか、プログラム開発機VY21A/W5の方でも、時間を掛けて調べたら、やはり不調が発生していたのが分かった。

その原因は、やはり私のプログラムの組み方が拙かったようで、cam.release()を効果を盲信/妄信していたせいらしい。
調べて行く内に、前のカメラを解放するコマンドcam.release()を発行したとしても、実はそれだけでは、完全に解放したことにはならず、次のカメラをアクセスしに行ってはいけないらしいことが分かって来た。

映像表示データの読込&表示のループを終了する際、ループを出た処でも、“必ず、waitKey(30/33)を入れなければいけない!”ということも分かった!
むしろ、こちらの方が、cam.release()よりも、終了・解放効果は大きいようだ。
(尚、30か33msecかは、どちらでも構わなくて、好みによるらしい。笑)

この対策で、主なエラー発生は停められたが、まだ、別の妙なエラーも、稀に発生しているので、これの原因を探さねばならない。

−−−−−−−−−−−−−−−−−−−−−−−−−
プログラムとUSB信号(?)
元々、私は“USBなんて、PS/2の進化したもの”程度の認識しか無かったのだが、USBカメラの映像/動画が、結構綺麗だし、カメラ自体もコンパクトだし、系全体もそれ程嵩張らないことが気に入って、“何処まで出来るの?”と“USBカメラの多数台接続”に溺れてしまった。(苦笑)

その映像表示プログラムも、簡単に書けるし、修正・変更も容易!
ただ、その限界に挑戦しようとすると、やはり簡単には刃が立たないようだ。

USB/WEBカメラの複数台接続については、ネットで調べても、あまり言及されていない。
2台までというのが通説で、それ以上は、“出来るかもしれない...”、あるいは、“無駄だから、しない”ということらしい。
もしかしたら、OpenCVの最新バージョン辺りでは、課題は、綺麗に解消されているかもしれないが、今、当苑の開発環境(VC++2008ExpresseOpenCV2.0)を変えてしまう勇気はない。で、(意地でも、)“今の環境でも、こうやれば出来る!”という例を拵えてみようと思っている。

左図(図3)は、カメラ毎の映像データ取り込みと、表示をさせるもので、(cam_no)を変えて、異なるカメラの映像を次々と同じ窓に表示させる(昔風に言えば、一番簡単な、)サブ・ルーチンだ。

今回は、エラー発生を停めるのに、当初は5秒間の休憩ではどうだろう?と、returnの前辺りにwaitKey(5000)を入れることから始めた。
ん?どうやら効果がありそうだ!

その後、色々実験した結果、最終的に、図3のようにした。
これで、室内カメラ6台切替対応機(VY21A/W5)も、室外カメラ4台切替対応機(D430)も、全くエラー発生が無くなった!
(cam.release()は有っても無くても影響は無いようだが、“見栄え”で、入れてある)

ただし、屋外カメラ「130万画素カメラ(BUFFALO BSW13KM02)(ジャンク品)」は、この方法でも解消出来ず、どうやら別の原因でエラーが起きているようなので、今後要調査対象だ。

因みに、USBバス上の信号をオシロで眺めてみたが、詳細は分からず。(図4<クリック>
見られる波形は殆ど“定常的”で、USB系に動きがある時は、微細な部分が、チョロチョロ変わっているようだが、それにしても、バス上に、こんな信号が定常的に出ているとは、知らなかった!

色々な表示方法で試したが

USBカメラは、少なくとも2台は、同時並行的に映像信号を拾える(はずだ)から、もし、1台目のカメラをrelease()して、2台目で表示継続している間に、3台目に(自然に?)切り替えられないか?と、思った。
それでやってみたのが、図5及び動画1だ。

しかし、なかなか思惑通りには行かないものだ。
室内対応機なのに、エラー発生は早かった!(とほほ)
これなら、単純にwaitKey(xx00)で片付ける方が、分かり易い。

それに注意して、室外対応機のエラー発生の様子を見ていると、上述のような決まったカメラ(ジャンク)からが多いので、これを“一時使用停止”にしてみた。
そしたらビンゴ!エラー発生が激減した。waitKey(33)にしてみたが、まだ落ちていない!

(このカメラは、もしかしたら、“ハブとの接続不良”など、別の悪要因があるかも知れないので、また調べてみよう)

妙なエラー

上記のエラー以外に、稀に、(何だ?こりゃ?というような)[ソースのキャプチャ]・「ビデオデバイスの選択画面」が出て来ることがある。
このエラーも性質が悪くて、プログラムを終了させようにも、このメニューからではどうにもならない。
最後の手段は、Ctrl+Alt+Delキーで強制的にコンピュータを停止させ、電源を落とす以外に方策が無いという厄介さだ。

waitKey(33)では不足かと、waitKey(330)と10倍に増やして試して見ているが、何せ発生が稀なので、思うように確認が出来ない。
こちらの方も、原因が分かれば、簡単な対策でエラー発生を抑えられるのではないかと思うが、それを見付けるまでが大変だ。


[表紙頁]へ  関連記事の目次へ