2012/11/13

顔検出

概要

画像工学において、顔検出はとてもキャッチーなテーマである。
キャッチーであるがゆえに手あかが付きすぎていて、紹介するのも恥ずかしいくらいだ。

学習した分類器によって、ある矩形領域が顔か否かを判定していく。
学習済みデータがOpenCVには用意されているので、今回はそれを使おう。
(もちろん、自分でゴリラの顔を学習させることもできる)
なお、これは顔に特化した方法ではない。

顔認識じゃない

認識(Recognition)ではなく、検出(Detection)だ。
(顔が誰のものかはわからない。顔の位置がわかるだけ)
ゴリラでも間違いやすいので注意しよう。

アルゴリズム

「Haar-like特徴量」、「ブースティング」あたりでググれ
サルでもわかる顔検出の原理 http://d.hatena.ne.jp/Cru/20100613/1276436975

実装

objdetect のライブラリを使うぞ!
ライブラリについて http://gori-naru.blogspot.jp/2012/11/opencvhelloworld.html
int main() {
    // 対象ファイル名
    string fileName = "images\\face.jpg";
    
    // 最大幅
    int maxWidth = 200;

    // 画像読み込み
    Mat originalImage = imread(fileName, CV_LOAD_IMAGE_COLOR);

    // 大きすぎる画像は小さくする
    if (originalImage.cols > maxWidth) {
        Mat resizedImage;
        float rate = 1.0 * maxWidth / originalImage.cols;
        resize(originalImage, resizedImage, Size(), rate, rate);
        originalImage = resizedImage;
    }


    /* ********* *
     *   顔検出
     * ********* */

    // 輝度画像に変換
    Mat grayImage;
    cvtColor(originalImage, grayImage, CV_RGB2GRAY);

    // 学習済み検出器の読み込み
    string cascadeName = "C:\\opencv\\data\\haarcascades\\haarcascade_frontalface_alt.xml";
    CascadeClassifier cascade;
    if(!cascade.load(cascadeName))
        return -1;

    // 顔検出を実行
    vector<Rect> faces;
    cascade.detectMultiScale(
        grayImage,   // 画像
        faces,       // 出力される矩形
        1.1,         // 縮小用のスケール
        2,           // 最小の投票数
        CV_HAAR_SCALE_IMAGE,  // フラグ
        Size(30, 30) // 最小の矩形
    );
    
    // 矩形を描く
    for (vector<Rect>::iterator iter = faces.begin(); iter != faces.end(); iter ++) {
        rectangle(originalImage, *iter, Scalar(255, 0, 0), 1);
    }

    // 表示
    imshow("out", originalImage);
    waitKey(0);

    return 0;
}

解説

学習済み分類器のデータは
[OpenCVのディレクトリ]\\data\\haarcascades
にある。プログラム内のパスは自分の環境に合わせて変更してくれ。
このディレクトリには、目を検出するものとか、横顔を検出するものとか、いろいろ入っていてわくわくする。
今回は正面顔を検出する学習器の一つを用いた。

検出の実行は CascadeClassifier::detectMultiScale で行う。
パラメータの詳細はリファレンスを読もう。
http://opencv.jp/opencv-2svn/cpp/objdetect_cascade_classification.html#cv-cascadeclassifier-detectmultiscale

実行 


0 件のコメント:

Related Posts Plugin for WordPress, Blogger...