Node.jsとOpenCVで顔認識してみます。


##やることとバージョン
OpenCVが気になっていたのでNode.jsから使えるライブラリを探して試してみました。

ライブラリはこちらを使ってみます。
https://github.com/peterbraden/node-opencv

- Node.js 0.12.0
- Mac OS 10.10.2 Yosemite
- Homebrew 0.9.5
- OpenCV 2.4
- node-opencv 3.0

### OpenCV
OpenCVはインテルが開発した画像処理や画像解析等のライブラリです。

http://opencv.jp/

##準備(とハマったところ)

### opencvインストールで戸惑う。

`npm install opencv`だけやろうとするとエラーめっちゃ出ました苦笑

```
$ npm install opencv
\
> opencv@3.0.0 install /Users/sugawara_nobisuke/n0bisuke/lab/opencv/node_modules/opencv
> node-pre-gyp install --fallback-to-build

child_process: customFds option is deprecated, use stdio instead.
child_process: customFds option is deprecated, use stdio instead.
/bin/sh: pkg-config: command not found
gyp: Call to 'pkg-config --cflags opencv' returned exit status 127. while trying to load binding.gyp
gyp ERR! configure error
gyp ERR! stack Error: `gyp` failed with exit code: 1
gyp ERR! stack     at ChildProcess.onCpExit (/Users/sugawara_nobisuke/.nvm/versions/v0.12.0/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:343:16)
gyp ERR! stack     at ChildProcess.emit (events.js:110:17)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (child_process.js:1067:12)
gyp ERR! System Darwin 14.1.0
・
・
・
```

どうやらpkg-configが無いよって怒られてるみたい

```
$ brew install pkg-config
```

まだエラーでてます。opencvがそもそも入ってなかった疑惑

```
$ brew install opencv
Error: No available formula for opencv
Searching formulae...
Searching taps...
homebrew/science/opencv
```

こうすると良いみたい。
http://qiita.com/laprasDrum/items/59092e96608dd106be63

```
$ brew tap homebrew/science
$ brew install opencv
・
・
・
==> python setup.py build --fcompiler=gnu95 install --prefix=/usr/local/Cellar/numpy
?  /usr/local/Cellar/numpy/1.9.1: 693 files, 14M, built in 112 seconds
==> Installing opencv
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/science/opencv-
######################################################################## 100.0%
==> Pouring opencv-2.4.10.1.yosemite.bottle.tar.gz
?  /usr/local/Cellar/opencv/2.4.10.1: 219 files, 39M
```

上手くいったみたいです。
これでMac(Yosemite)にopencv2.4がインストールされたみたいです。

もう一度node-opencvを入れてみます。

```
$ npm install opencv
-
> opencv@3.0.0 install /Users/sugawara_nobisuke/n0bisuke/lab/opencv/node_modules/opencv
> node-pre-gyp install --fallback-to-build

child_process: customFds option is deprecated, use stdio instead.
child_process: customFds option is deprecated, use stdio instead.
  CXX(target) Release/obj.target/opencv/src/init.o
  CXX(target) Release/obj.target/opencv/src/Matrix.o
  CXX(target) Release/obj.target/opencv/src/OpenCV.o
  CXX(target) Release/obj.target/opencv/src/CascadeClassifierWrap.o
  CXX(target) Release/obj.target/opencv/src/Contours.o
  CXX(target) Release/obj.target/opencv/src/Point.o
  CXX(target) Release/obj.target/opencv/src/VideoCaptureWrap.o
  CXX(target) Release/obj.target/opencv/src/CamShift.o
  CXX(target) Release/obj.target/opencv/src/HighGUI.o
  CXX(target) Release/obj.target/opencv/src/FaceRecognizer.o
  CXX(target) Release/obj.target/opencv/src/BackgroundSubtractor.o
  CXX(target) Release/obj.target/opencv/src/Constants.o
  CXX(target) Release/obj.target/opencv/src/Calib3D.o
  CXX(target) Release/obj.target/opencv/src/ImgProc.o
  SOLINK_MODULE(target) Release/opencv.node
  SOLINK_MODULE(target) Release/opencv.node: Finished
  COPY /Users/sugawara_nobisuke/n0bisuke/lab/opencv/node_modules/opencv/build/opencv/v3.0.0/Release/node-v14-darwin-x64/opencv.node
  TOUCH Release/obj.target/action_after_build.stamp
opencv@3.0.0 node_modules/opencv
├── buffers@0.1.1
├── nan@1.4.3
└── node-pre-gyp@0.5.31
```

##動かしてみる

まずは画像を用意します。　[LIGの入社式記事](http://liginc.co.jp/news/notice/house-event/81504)から拝借。

![](http://i.gyazo.com/c269e244bf5be9a858e11b7ebf0081a0.png)

n0bisuke.jpgとして保存してapp.jsと同じ階層に設置しました。

```app.js
var cv = require('opencv');

cv.readImage("./n0bisuke.jpg", function(err, im){
  im.detectObject(cv.FACE_CASCADE, {}, function(err, faces){
    for (var i=0;i<faces.length; i++){
      var x = faces[i]
      im.ellipse(x.x + x.width/2, x.y + x.height/2, x.width/2, x.height/2);
    }
    im.save('./out.jpg');
  });
})

```

実行してみます。

```
$ node app.js
```

out.jpgが出力されているので確認してみます。

![](http://i.gyazo.com/1dd4a6d624e5c39a99499fa2358dce62.png)

顔に印がついてますね!

どうやら顔認識ができたみたいです。