Mac * Node.jsでOpenCV(顔認識)

OpenCVを導入するためにRuby2.3以上が必要でRubyを入れるためにはrbenvが必要でhomebrewで入れようとしたらcommand line developer toolsのインストールが必要。python2.7も必要





コマンドラインツールが入っていない場合


すでに入っているなら不要

ターミナルからコマンド
brew upgrade ruby-build
実行時に
Error: Xcode alone is not sufficient on Sierra.
Install the Command Line Tools:
xcode-select --install
とエラーが出たら、表示されたとおりに
xcode-select --install
を入力するとインストールできる。



homebrewが入っていないなら入れる


パッケージ管理をしてくれる。
RubyとPythonを管理するのに使用する。

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

なんとインストールにRubyを使用している!!(Macは古いバージョンがすでに入っているので一応使える)
今からRubyを入れようという話ではなかったか.....

インストール後もしくはすでに入っているなら更新する。
brew update



rbenvが入っていないなら入れる



Ruby管理用

brew install rbenv



Ruby 2.3 をインストール


すでに入っているバージョンが2.3以上なら不要。

ruby-buildのアップデート
brew upgrade ruby-build

とりあえず入りさえすればいいので2.3を指定
rbenv install 2.3.0
rbenv global 2.3.0

OpenCVインストール
brew tap homebrew/science
brew install opencv@2

途中エラーが出ている
Error: The `brew link` step did not complete successfully
brew link --force opencv@2



python2.7 をインストール


npm install時にpython2.7を使用している模様。

pyenvも必要になる...
brew install pyenv

一覧表示
pyenv install --list

2.7.xをインストール
pyenv install 2.7.14

echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source ~/.bash_profile

上記で.bash_profile にpyenvの設定が追記適用される。
pyenvでインストールしたpythonを利用できるようになる。



プロジェクトディレクトリにOpenCVインストール



npm i -S opencv

ダウンロードに失敗している(そもそもリンク先が存在しない)がいける?
node-pre-gyp ERR! Tried to download(403): https://node-opencv.s3.amazonaws.com/opencv/v6.0.0/Release/node-v48-darwin-x64.tar.gz
node-pre-gyp ERR! Pre-built binaries not found for opencv@6.0.0 and node@6.11.4 (node-v48 ABI, unknown) (falling back to source compile with node-gyp)
挙動的にはダウンロードに失敗した場合pythonでごにょごにょしてるとかだろうか?



サンプルソース



var opencv = require('opencv');

// sample.jpg を読んで 顔に丸をつけてout.jpgに出力
cv.readImage("./sample.jpg", function(err, im){
  im.detectObject(opencv.FACE_CASCADE, {}, function (err, faces) {
    if (err) {
      console.log(err)
    } else {
      faces.forEach((face) => {
        im.ellipse(
          face.x + face.width / 2,
          face.y + face.height / 2,
          face.width / 2,
          face.height / 2)

      })
      im.save("./out.jpg")
      done()
    }
  })
})

顔の部分をすべて○で囲っている。




参考



https://github.com/peterbraden/node-opencv
https://qiita.com/tmknom/items/56542abd9341820bb9cc
http://calmery.hatenablog.com/entry/2017/01/12/190136


途中エラーを吐いているのがちょっと気持ち悪い。
TypeScriptの型情報がないので自前で用意する必要がある。
ソース動かすまでがやたら長いのどうにかならないものか。
まなたドキュメントがないっぽい上に他のOpenCVと微妙に記述が違うそうなので細かいことをやろうとすると結構つらい。

2018年3月8日木曜日