自作武器を作ろうず

<!--リトルカブにカブ90(HA02)のエンジン積んで,ペットボトルロケットでロケットランチャーを作り,ChromebookでETロボコン出て,Arduinoでウンコ妨害装置作る<strike>沖縄の学生のブログです。院生になりました</strike> いまは広島で社会人エンジニャーしてます -->


VideoCapture cap(0) 実行時にフリーズする問題(OpenCV, C++)

Abstract

 USBカメラから取り込んだ映像をOpenCVでアレコレ触ろうと思ったのですが,実行時に"VideoCapture"コンストラクタを呼び出した段階でフリーズする(コンパイルエラーも実行時エラーも出ずただフリーズするのみ.)という現象が見られました.結論から言うと,「どうもこれはカメラ側の問題っぽい」という結論に至りました.

f:id:teppodone:20200823145832j:plain:w640
冷やしOpenCVはじめました

事象・概要

 「冷やしOpenCVはじめました!」…かったんですが早速壁にぶち当たりました.以下事象の詳細です.

やりたかったこと
 Raspvberry Pi 上で OpenCV を使って USBカメラからの映像を取り込みたかった.

やったこと
  1. Raspvberry Pi に OpenCV4 をインストールしUSBカメラを接続した.
  2. コード(後述)をコンパイルした.このときコンパイルエラーは発生せず.
  3. 実行したところ,VideoCapture クラスのオブジェクト生成(10行目)周辺で処理が止まった.このとき実行時エラー,ワーニングは発生せず

コード*1

/* camera.cpp */
#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"

using namespace cv;
using namespace std;

int main(){
 cout << "Handle USBcam with OpenCV4" << endl;
 VideoCapture cap(0);  //USBカメラを扱うためのオブジェクト生成. どうもココで止まってるっぽい.

 if(cap.isOpened()) cout<<"succeeded to open camera \n"<<endl;
 else         cout<<"faild to open camera \n"<<endl;

 return 0;
}



コンパイルと実行結果

pi@raspberrypi:~/  g++ `pkg-config --cflags --libs opencv4` camera.cpp
pi@raspberrypi:~ $ ./a.out 
Handle USBcam with OpenCV4
_                            #←ずっとこのままウンともスンとも動かない



これが発生した環境

仕様
備考
OpenCV4 C++
V4.0.0
こちらの手順に従ってインストールした
OpenCV4 for Raspberry Pi - Qiita
Raspberry Pi Pi2
USBカメラ HD
UVC
大昔にAliexpressで買ったやつ
720P HD Video Surveillance UVC USB Camera mini usb Camera module CCTV PCB Board CMOS pc webcam support Windows pc free shipping|cctv pcb board|module cctvcamera mini usb - AliExpress
f:id:teppodone:20200824084720j:plain:w360
ジャンクの箱からボワッと~(ボワットー) 怪しいカメラが登~場~


解決策(?)と分かったこと

 電気屋行って適当なUSBカメラ"UCAM-C310FBBK(ELECOM)"買ってきて付けたら動きました.「何じゃそりゃ」と思うかもしれませんが,そんだけです.Aliexpressで買った例の中華カメラ(以下,「中華カメラ」)を刺したら上記不具合が発生し,UCAM-C310FBBK(ELECOM)を刺したら普通に動くという現象が確認されました.
 www.elecom.co.jp


分かったこと
以上のことから,次の事がわかりました.
 OpenCVとUSBカメラには相性みたいなのがあり,相性が悪いと実行時にVideoCapture オブジェクトを生成した段階でフリーズすることがある.

 今回「USBカメラを変えたら動いた」という所まではわかりましたが,「じゃぁ何故,中華カメラでは動かなかったのか」という所まではわかりませんでした.もしかすると,OpenCV側の設定やパラメータを弄ったら中華カメラも動かせるのかもしれません.が今の所私はそこまでたどり着けてません.あとでドキュメント読みます.


質問コーナー
Q. それカメラが壊れてただけでは?
 それがそういう訳でもなさそうです.Raspvberry Pi に中華カメラを接続し,mjpg-streamer(ストリーミングするやつ)を起動したところ,普通に中華カメラからの映像を配信できました.よってカメラが壊れたわけではないみたいです.

Q. オブジェクト生成時の引数(デバイス番号?)が違うんでは?
 上記のコードの10行目,VideoCapture cap(0); について,VideoCapture クラスのオブジェクトを生成するときに,引数にはUSBデバイスの番号(?)を指定する必要があります("cap(0)"の"0"の部分). この数字は大概の場合は”0”ですが,USBカメラの接続状況によっては”1”や"2"等,適切な番号を指定してあげる必要があります.
 当然間違ったデバイス番号を指定すると実行時にエラーが出るのですが,その場合は明示的にちゃんと下記のエラー文が表示されます.

pi@raspberrypi:~$ ./a.out # 10行目を VideoCapture cap(1); に変えたコードをコンパイルしたやつ
Handle USBcam with OpenCV4
[ WARN:0] global /home/pi/opencv-4.2.0/modules/videoio/src/cap_gstreamer.cpp (1759) handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Device '/dev/video1' is not a capture device.   
[ WARN:0] global /home/pi/opencv-4.2.0/modules/videoio/src/cap_gstreamer.cpp (888) open OpenCV | GStreamer warning: 
unable to start pipeline
[ WARN:0] global /home/pi/opencv-4.2.0/modules/videoio/src/cap_gstreamer.cpp (480) isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created
[ WARN:0] global /home/pi/opencv-4.2.0/modules/videoio/src/cap_v4l.cpp (887) open VIDEOIO(V4L2:/dev/video1): can't open camera by index
faild to open camera 

 このようにデバイス番号の指定を間違えた場合は,ちゃんとエラーで「1番にはUSBカメラ繋がってないやで(三行目の" Device '/dev/video1' is not a capture device. ")」と教えてくれますが,今回はエラーも出ずにアボートもされず,ただ止まるのみという状況だったので,コレとはまた別だと思います.

//---------------------------------

 「USBカメラ自体は生きている」「エラーが出ない」が重なった結果,「原因は分からんけどUSBカメラが動く...ってことは,問題はUSBカメラ以外のどっか別の所に問題が有るんやろ!」と思ってトラブルシューティングするという最悪のムーブをしてしまいました.志村後ろ !原因はそこや(足元!!
 ともあれ,これでようやくUSBカメラを使った顔検出ができるようになってめでたしめでたし.



日記

 ファクトリオやりてぇ~~~ 生産ライン引きてぇ~~~~~!!!!!
 
 あのですね,GWの暇つぶしにゲーム買ったんスよ.無人の惑星で工場の自動化ラインを引くゲーム「ファクトリオ」.
 もうニッチな沼感がぷんぷんしますが,お察しの通りとんでもない沼地でして.製品ができるまでのリードタイムを計算して工場ラインのレイアウト設計を最適化したり,生産のボルトネックになってる部分を改善したり,時間的効率 VS 歩留まり どっちを優先させるかとか考えたりの,常に「現状でも十分だけど,もっと効率化できる方法は無限にある」が存在するタイプのゲームです.

 な ん で す が … ファクトリオ入れて遊んでたメインPCが5月末にご臨終しちゃって.その日からHDDのなかに眠る僕の工場は,今日のいままで生産停止してるんすよね… 工場再稼働に向けてゲーがミングする感じのPCを組みたいんですが,でもシンゾー君*2の給付金はクラブマンの輸送費とGP100TT(タイヤ)と3Dプリンタに使っちゃったしなぁ…

f:id:teppodone:20200824160835j:plainf:id:teppodone:20200824160829j:plain
せんきゅーシンゾー…日本経済10万1千までキッチリ回したぜ…(3D🍮は中国製だけど許して)

*1:参考URL:「【初心者向け】USBカメラで撮影した動画をリアルタイムで顔検出(https://qiita.com/yutoakaut/items/6787aed37721a8a22f64,2020/08/24閲覧」

*2:2020/08/28 19:13 追記 上記の記事は一週間前ぐらいに書いて予約投稿セットしてたんだけど,今日仕事から帰ってきてニュース見て.まぁ驚いたわ.今まで長いことお疲れさまでした.ありがとうございました.どうかお体を大事にされてください.

Copyright © 2012- piyo teppodone piyo