[2018年5月6日]
カメラ切替エラー予防策を、施した
USBカメラを当初2台から、順次アクセス出来るような「自作プログラム」を作り、それを改造し続け、現在は、(自前の)“切替法”によって、10台までアクセス出来るようになった。
USB2.0カメラの同時(動)画表示は、(当苑の系では)最大2台までだが、“切替法”で、何とか最大4画面/窓の表示が出来る。
ただし、2画面が動画の時には、他の2画面は静止画でしかないという制約がある。
それに、切替には2〜3秒の遅延があり、なかなかスパッとはいかない。
しかも、その“切替法”を続けると、やがて「メモリ・リーク」か「USERオブジェクト過剰」による?“エラー”で、「(自作)プログラム」が落ちてしまう。
先日、それまでの時間を測ってみたら、かなり精度良く決まる/落ちるようだ。(苦笑)
だが、予めその手前で、一旦終了させればリフレッシュされる。
なので、もし、上手く“自動終了→自動再起動”が出来れば、“エラー発生”を避けることが出来るってわけ!
で、今回、主プログラム(UCam10.exe)が自滅した後、再度“自動起動”させる補助プログラム(UCamM.exe)を作った。(図1 2〜3秒で消えるUCamM.exeのメッセージ)
(本来なら、こんな小さな“補助プログラム”でも、上位に置いて、その下になる“主プログラム”を顎(あご)で使うはずなんだが...)
でも、今回は工夫をして、“主プログラム”が主導権を持ち、自爆時期(!?)が来ると、先に“補助プログラム”を呼び出して仕事をさせ、任務が済めば、自分で消滅させるようにした。(意外に簡単に上手く行った♪)
補助プログラム(UCamM.exe)では、以下のような処置をさせている。(図2<クリック>)
WinExec("UCam10.exe /R", SW_SHOW); ・・・相手(UCam10)を再起動する。
WinExec("taskkill /im UCamM.exe /F", SW_HIDE); ・・・自分(UCamM)を強制終了させる。
多分、これで上手く行くはず!(行ってくれ〜!...笑)
−−−−−−−−−−−−−−−−−−−−−−−−−
+++ タイマー方式では間に合わず? +++
“補助プログラム”の方は、上記の如くだが、“主プログラム”の方では、起動・再起動から表示時間*5倍*60秒だけ(タイマーをセットして)待って“自爆”するように作ってみた。(図3)
(“自爆”といっても、“復活”を期待してのことだから、一種の冷凍保存法みたいなものか?笑)
ところが、この方式で時間を設定したら、見事に失敗!...マイナス1ずつでは、待ち時間が長くなり過ぎて、間に合わず、“エラー”が先に発生!?
結局、「減算カウンタ」を用意し、それに初期値を(大体)1200位に設定して、4画面を描く毎に、4ずつ...ではなくて、8ずつ“減算カウント”して、それがゼロになったら、“自爆”するようにした。 ・・・ これで、“エラー発生”が無くなった!
ということは!...カメラの切替回数は、およそ150回(Win7、メモリ2GB、DELL D430マシン上の「VC++プログラム」では)が可能な上限だってことらしい。
それは兎も角として、主プログラム(UCam10.exe)の方では、補助プログラム(UCamM.exe)を先に起動するようにしている。(図3)
WinExec("UCamM.exe ", SW_SHOW); ・・・補助を起動
WinExec("taskkill /im UCam10.exe /F", SW_HIDE);・・・自分を強制終了
これらの“実行順序”が重要で、逆にしたら、まったく意味無し!
また、これらの間に、“時間差”は設けなくてもいいようだ。
(一定回数後に、)この処置が実行されると、“主プログラム”の全画面が消えて、図1のような(補助プログラムの)表示が一瞬出る。
それも、1秒で消え、“主プログラム”が(再度)呼び出されると、参考用の小画面/窓群と“主メニュー”が出て来る。(図4<クリック>)
この場面の2回目以降は、自動的に実行するようにしてある。
この時に、「Windowsタスクマネージャ」を呼び出して“プロセス”を見ると、いずれも値が小さくなっており、リフレッシュされたことが分かる。
+++ UCam10の概要 +++
元々は、USBカメラ複数個で、看視系が出来ないか?という発想からだったのが、映像の同時表示が最大2台までという制約に我慢出来ず、何とか多数台の映像を見たいという欲に駆られて、作ってきたもの。
世の中には、幾つかの便利なソフトはあるが、どれも1、2台限りだし、自分の好き勝手な仕様にするには、自分で作るしかない!ということで、あれこれ付け足して来たら、今や「ハウルの動く城」の如くになった。(笑)
この「自作プログラム(UCam10)」は、Visual C++ 2008 ExpressとOpenCV 2.0で作ってあるのだが、(道具としての)“USB2.0”や“OpenCV 2.0"では、あまり考慮されていないらしい領域にまで押し入って、自分が欲しいものを無理に要求しているようなので、妥協の産物的なモノになっている、と思う。
これで現在出来ることは、1台の「Win7マシン」と複数の「USB2.0-HUB」や「USB2.0用ケーブル5m」などを使って、「10台までのUSBカメラ」の映像取り込みと動画・静止画の表示。
「表示パターン」は、以下の5パターン。(今はこうだが、将来は不明)
1−1台を決めると、ずっと全画面で、動画
2−2台を決めると、ずっと画面2分割で、動画(縦長画面も可能)
3−3台を決めると、ずっと画面3分割で、動画(ただし、3台目は映像が出ない)
4−4台を決めると、上下半分ずつ動画(5〜60秒タイマー切替式)(図4<クリック>)
5−5台以上では、1台ずつ順送りで切替、動画(タイマー切替式)
(図3の)「ラジオボタン」の背景色−緑色は、カメラが接続されていて、読み込みが可能なことを示す。
上の数字の背景色−茶色は、「表示対象カメラ」を意味していて、(クリックで何時でも)指定出来て、一度[停止]か[開始]ボタンを押せば“確定”になる。
その“茶色数”によって、(前記の)「表示パターン」が変わるようにしてある。
これらの「設定値」は、“UCam10.ini”に用意しておいて、それを読み書きする方式にしている。
尚、USBカメラのアクセス順序は、MS社製が1番になっているらしいが、OSが異なれば、また違ってくるのかも。
その後の順序は、登録の古い順とか、ホットプラグ状態で差した順番とかで決まるようだが、いずれにしても、順序はあまり好きなように出来ないのがUSBカメラの特徴らしい。
カメラの「ドライバ」は、よほど特殊なものでない限り、Win7が(Windows Updateで)探して充当してくれるようだ。
充当までに時間は掛かるが、一番楽な方法。
カメラ映像の質は、4画面モード、及びカメラ5台以上の時は、QVGA固定にしたので、やや粗い。(これは、信号・情報量の点から、増やす/良くすることは無理だろう)
その他のモード時には、VGAにしてある。