前提
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さんの画像を用意した上で
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);
上記スクリプトを実行すると次のウインドウが現れます。
成功です。やりましたね。