おはようございます。実家の父が先日、この4月から小学校の長男向けに、次男のぶんと合わせて机を作って くれていたものが、完成し、我が家で使い始めました。兄弟で机に向かうことが今の所は多いです。 これがずっと続くと良いなぁと思っている@kjunichiです。
背景
実は、前々から自分のMacBook Proで初回起動すると、落ちるような気がしていて、 ただ、一度落ちるとその次から正常に動いているので、あまり気にしていなかった事象だったのですが。
クリーンインストールしてしてSSDの容量稼いだものの、その後、あまり触っていないこのMacBook Pro rbenvすら正しく設定しておらず、mrubyの最新版をgit cloneしてくれる便利Gemのmrbすら入れようとして、 ルート権限ないぞ!と怒られました。
rbenvの設定は、なぜか以前は.bash_profileが存在して、ここに書いていたのに、 クリーンインストール後は.profileとLinux系だと標準的?なファイルになっており、ここに以下のように追記
eval "$(rbenv init -)"
その後、このコマンドを実行して、ログアウトやsourceを回避して、mrbのGemを入れた。
gem install mrb rbenv rehash
これでようやくmrbでmrubyをいつでもGitHubのUrlを調べることなく、最新版をcloneできる。
mkdir -p ~/work/mruby-webcam cd ~/work/mruby-webcam mrb get git clone https://github.com/kjunichi/mruby-webcam.git
以前はopencv3と明示して入れていたHomebrewのOpenCVも今では以下のようにopencvで 一発インストール可能になっていたりして。
brew install opencv
その後、git cloneしたmruby-webcamを動かそうとmruby配下のbuild_config.rbを以下のように
MRuby::Build.new do |conf| # load specific toolchain settings # Gets set by the VS command prompts. if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] toolchain :visualcpp else toolchain :gcc end conf.gem '../mruby-webcam' conf.enable_test # include the default GEMs conf.gembox 'default' end
と記述して、rakeコマンドでビルド。mrubyに組み込んだmruby-webcamを以下のように
./bin/mruby ../mruby-webcam/examples/webcam.rb
と試したら、
OpenCV(3.4.1) Error: Assertion failed (size.width>0 && size.height>0) in imshow, file /tmp/opencv-20180630-96466-n6g9lf/opencv-3.4.1/modules/highgui/src/window.cpp, line 356 libc++abi.dylib: terminating with uncaught exception of type cv::Exception: OpenCV(3.4.1) /tmp/opencv-20180630-96466-n6g9lf/opencv-3.4.1/modules/highgui/src/window.cpp:356: error: (-215) size.width>0 && size.height>0 in function imshow
とエラー、この時点で、初回起動時落ちることがあることを思い出し、 再度実行すると無事、iSightのカメラの映像がウィンドウに表示された。
たまに動かすと良い発見がある?!
以前は、このエラーの
libc++abi.dylib: terminating with uncaught exception
の箇所に目が行ってしまい、あぁ、またAppleの嫌がらせだろう?(以前ビデオ周りのキャプチャーAPIが ゴッソリ変更があった記憶がある)と被害妄想を膨らませていた。
ところが、今回、改めて見ると、
Assertion failed (size.width>0 && size.height>0) in imshow
冒頭のこの部分にちゃんとimshowで(表示)対象のサイズが0以下だ!と言ってる ことを発見したw。
対策
imshowに渡しているものと言えば、mruby-webcamではキャプチャー結果のcv::Mat型の変数。
cv::Mat frame;
このframeのサイズがおかしい時にimshowを呼ばなければ、少なくともエラーが起きなくなる。
この時点で、cv::Matのサイズを調べるべく
Assertion failed (size.width>0 && size.height>0) in imshow
でググって以下のページにより、emptyメソッドを知った。
http://electronics.extrem.ne.jp/cpp/opencv_videocapture/electronics.extrem.ne.jp
ありがたい。
あとがき
またしても、mrbgemをたまにメンテすると起きるCI対応に迫られ、今回はcinstでVersion指定してopencvの版を 固定してお茶を濁した。
ここ半年、バズらせようと練りに練った記事を立て続けに外しているので、 原点回帰的に本来のログに近い記事を上げてみた絶対諦めないロスジェネ。
関連記事
- 外部のライブラリに依存するmrbgemを使ってもmruby-cliでワンバイナリを作成できるようにした
- mruby-webcamをヘッドレス対応した
- mrubyでWebカメラを黒い画面にそのまま表示できるようにした
- mruby-webcamにWebカメラで取得する画像サイズを指定できるメソッドを追加した