概要
画像工学において、顔検出はとてもキャッチーなテーマである。
キャッチーであるがゆえに手あかが付きすぎていて、紹介するのも恥ずかしいくらいだ。
学習した分類器によって、ある矩形領域が顔か否かを判定していく。
学習済みデータが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 件のコメント:
コメントを投稿