広く浅く時々深く

やってみたいなと思ったことをなんとなくやってみる

OpenCVで顔検出

OpenCV使えば顔検出も数十行でできちゃうよってことで、簡単なサンプルのご紹介をば。

開発環境

OS Mac OS X 10.11.6 ( El Capitan )
メモリ 4 GB 1600 MHz DDR3
プロセッサ 1.3 GHz Intel Core i5
OpenCV 3.0.0

サンプルコード(facedetect.cpp)

#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>

using namespace std;
using namespace cv;

int main() {
  // カメラの起動
  VideoCapture cap(0);
  CascadeClassifier cascade;
  cascade.load("/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt2.xml");
  vector<Rect> faces;
  Mat frame;
  while (1) {
    // カメラから取得した画像をフレームに落とし込む
    cap >> frame;  
    // 指定した識別器を用いて画像から対象を検出
    cascade.detectMultiScale(frame, faces, 1.1,3,0,Size(20,20));  
    // 検出した対象を囲む矩形を元画像に描画
    for (int i = 0; i < faces.size(); i++){
      rectangle(frame, Point(faces[i].x,faces[i].y),Point(faces[i].x + faces[i].width,faces[i].y + faces[i].height),Scalar(0,200,0),3,CV_AA);
    }
    imshow("Detect Faces", frame);
    int key = waitKey(10);
    if (key == 27) {//escが押されたら終了
      break;
    }
  }
  return 0;
}

実行方法

コマンドラインに以下のコマンドを打てばok.

 $ clang++ `pkg-config opencv --cflags` `pkg-config opencv --libs` -o facedetect facedetect.cpp 
 $ ./facedetect

まとめ

haarcascadesフォルダの中には顔検出以外にも目だけを検出するやつだったり、
全身を検出するやつだったりいろいろあるから
サンプルコードの/usr/local/share/OpenCV/haarcascades/以下のファイル名を変えて実行してみると面白いかと。
ただhaarcascadesフォルダへのパスは、自分の環境ではのお話なのでここは適宜書き換えいただく必要ありです。

このサンプルに機械学習とか足してあげて顔認識とかやってみたいですねー。
きっとやってる方いるんでしょうけど。
機械学習OpenCVでできちゃうんで、いずれ触ってみたいですね。
ちゃんとできたらまた書きます。