概要
画像工学において、顔検出はとてもキャッチーなテーマである。
キャッチーであるがゆえに手あかが付きすぎていて、紹介するのも恥ずかしいくらいだ。
学習した分類器によって、ある矩形領域が顔か否かを判定していく。
学習済みデータがOpenCVには用意されているので、今回はそれを使おう。
(もちろん、自分でゴリラの顔を学習させることもできる)
なお、これは顔に特化した方法ではない。
学習した分類器によって、ある矩形領域が顔か否かを判定していく。
学習済みデータが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; }
解説
学習済み分類器のデータは
このディレクトリには、目を検出するものとか、横顔を検出するものとか、いろいろ入っていてわくわくする。
今回は正面顔を検出する学習器の一つを用いた。
検出の実行は CascadeClassifier::detectMultiScale で行う。
[OpenCVのディレクトリ]\\data\\haarcascadesにある。プログラム内のパスは自分の環境に合わせて変更してくれ。
このディレクトリには、目を検出するものとか、横顔を検出するものとか、いろいろ入っていてわくわくする。
今回は正面顔を検出する学習器の一つを用いた。
検出の実行は CascadeClassifier::detectMultiScale で行う。
パラメータの詳細はリファレンスを読もう。
http://opencv.jp/opencv-2svn/cpp/objdetect_cascade_classification.html#cv-cascadeclassifier-detectmultiscale
0 件のコメント:
コメントを投稿