non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

mruby-webcamの安定性が向上しました

おはようございます。実家の父が先日、この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メソッドを知った。

electronics.extrem.ne.jp

ありがたい。

あとがき

またしても、mrbgemをたまにメンテすると起きるCI対応に迫られ、今回はcinstでVersion指定してopencvの版を 固定してお茶を濁した。

ここ半年、バズらせようと練りに練った記事を立て続けに外しているので、 原点回帰的に本来のログに近い記事を上げてみた絶対諦めないロスジェネ。

関連記事

6年前の記事