LoginSignup
16
8

More than 5 years have passed since last update.

macOS+Node.js+OpenCV環境の構築

Last updated at Posted at 2019-03-01

前提

OpenCVで遊ぶならPython環境が鉄板だと思います。

本稿はそれでもNode.jsからOpenCVを使いたい人向けの記事です。

Node.js+OpenCVの選択肢

Node.jsからOpenCVを使いたい場合、ライブラリとして主な選択肢は次の2つになります。

前者はOpenCV version 2、後者はOpenCV version 3のライブラリになります。

前者は全然メンテされていません。最新バージョンの6.0.0リリースから2年経っています。後者はそこそこメンテされていそうです。

OpenCV3の方が画像まわりのAPIが増えているらしいので、顔認識をしたい場合は後者を使った方が良い可能性があります。

前者の方がネット上の利用例は多そうですが、Pythonに比べたら利用例は圧倒的に少ないので、その意味では五十歩百歩かもしれません。

macOSで使おう

さて、上記ライブラリのうち、前者のライブラリ opencv をmacOS上で使おうと思うとイマイチうまくいきません。ネット上で調べてみても失敗事例が多い気がします。

後者のライブラリ opencv4nodejs は次のようにすれば使えます。

$ brew install cmake opencv@3
$ brew link --force opencv@3
$ export OPENCV4NODEJS_DISABLE_AUTOBUILD=1
$ npm i opencv4nodejs

brew link するのはカッコ悪いんですがlinkしないと正しく動くバイナリが作れませんでした。

動作確認

ビルドがうまくいっているか、動作確認してみましょう。

$ curl http://www.lenna.org/len_std.jpg -o lenna.jpg

で有名なLennaさんの画像を用意した上で

lenna.js
const cv = require('opencv4nodejs');

const img = cv.imread('./lenna.jpg');

const classifier = new cv.CascadeClassifier(cv.HAAR_FRONTALFACE_ALT2);

const grayImg = img.bgrToGray();

const result = classifier.detectMultiScale(grayImg);

if (!result.objects.length) {
  throw new Error('failed to detect faces');
}

const minDetections = 10;
result.objects.forEach((faceRect, i) => {
  if (result.numDetections[i] < minDetections) {
    return;
  }
  const rect = cv.drawDetection(
    img,
    faceRect,
    { color: new cv.Vec(255, 0, 0), segmentFraction: 4 }
  );
});
cv.imshowWait('result', img);

上記スクリプトを実行すると次のウインドウが現れます。

image.png

成功です。やりましたね。

16
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
8