2017年3月5日日曜日

node-opencv を使って Mac のカメラで顔検出してみた

概要

Mac のカメラを使って OpenCV + Nodejs で顔検出をしてみました
公式のサンプルが静止画の顔検出だったので動画でリアルタイムに顔検出してみました

環境

  • Mac OS X 10.10.5
  • OpenCV .2.4.12
  • Nodejs 0.12.0
  • npm 2.5.1

OpenCV のインストール

node-opencv は OpenCV3 にまだ対応していません
今回は OpenCV のバージョン 2 をインストールします

  • brew install pkg-config
  • brew link --overwrite numpy
  • brew install homebrew/science/opencv
  • brew install ffmpeg
  • npm install opencv

とりあえずこれでインストールできました
自分の場合、過去 に OpenCV3 をインストールしていたので若干コマンドが異なる可能性があるかもしれません

顔検出するサンプルスクリプト

今回作成したサンプルは以下の通りです

  • vim face_detect.js
var cv = require('opencv')
var s = new cv.VideoCapture(0)

var camWidth = 320;
var camHeight = 240;
var rectColor = [0, 255, 0];
var rectThickness = 2;
s.setWidth(camWidth);
s.setHeight(camHeight);

var detect = function(){
  s.read(function(err, im){
    if (err) throw err;
    im.detectObject(cv.FACE_CASCADE, {}, function(err, faces){
      console.log("I spy", faces.length, "faces...")
      for (var i = 0; i < faces.length; i++) {
        face = faces[i];
        im.rectangle([face.x, face.y], [face.width, face.height], rectColor, rectThickness);
      }
      w = new cv.NamedWindow("face detect", 1)
      w.show(im)
      w.blockingWaitKey(0, 50);
      detect();
    })
  })
}
detect()
  • node face_detect.js

まず opencv を require して VideoCapture を使ってビデオを使用する準備をします

detect という関数を作成してこれを無限ループさせます
s.read でカメラで撮影している画面を読み込みます
読み込んだら読み込んだオブジェクトを元に im.detectObject で顔検出します

顔が検出できたら顔の分だけ四角で囲います
読み込んでかつ四角で囲った画像を w.show(im) で出力します
これを無限にループすることで動画のようにリアルタイムに顔検出しているように見せています

最後に

実際に実行できると別ウィンドウが立ち上がります
Mac に付属のカメラの画像が表示されているので顔を近づけると四角で囲まれると思います

今回ウィンドウサイズを 320 x 240 にしています
サイズを上げても問題ないですが、かなり動きが重くなるので PC のスペックに合わせて調整してください

とりあえずカメラで顔認識することができました
今度は Mac 内臓のカメラではなく外部のカメラとかを使ってやってみようと思います

参考リンク

0 件のコメント:

コメントを投稿