のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

OpenCVの使い方(8) 顔検出を行ってみる

Sponsored Links

皆さんこんにちは
お元気ですか。私は元気です。

さて、今日はOpenCVで顔検出を行ってみます。
顔検出とは、画面の中から顔を検出するタスクのことです。

早速ですが、ソースコードを書いてみました。

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

using namespace std;
using namespace cv;

Mat detectFaceInImage(Mat &image,string &cascade_file){
	CascadeClassifier cascade;
	cascade.load(cascade_file);

	vector<Rect> faces;
	cascade.detectMultiScale(image, faces, 1.1,3,0,Size(20,20));

	for (int i = 0; i < faces.size(); i++){
		rectangle(image, 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);
	}
	return image;
}

int main(int argc, char const *argv[]){
	Mat image = imread(argv[1]);
	string filename = argv[2];
	Mat detectFaceImage = detectFaceInImage(image, filename);
	imshow("detect face",detectFaceImage);
	waitKey(0);

	return 0;
}

ソースコードの解説ですが、第一引数に写真、第二引数に学習された識別器を入れます。
この識別器ですが、OpenCVのディレクトリに含まれています。

以下のサイトによると、haar特徴量と利用した抽出とlbp特徴を利用した特徴があるようですが、
精度が高いのはhaarで、速度が高速なのはlbp特徴だそうです。

opencv - Haar Cascades vs. LBP Cascades in Face Detection - Stack Overflow

実際に顔検出を行ってみます。先ずはLennaさん

なんかうまくいってる。

次は複数の顔を検出できるか行ってみます。

f:id:tereka:20150509023545j:plain:w360

首をひねった顔とか、若干隠れている顔そして、アニメ画像は検出できないようです。
アニメ画像で遊びたいと思った皆さん、実はアニメ画像用の識別器があります。

nagadomi/lbpcascade_animeface · GitHubにおいてあります。これを取得しましょう。そして、再度、顔検出を行ってみます。

絵里ちゃん以外は検出できています。気のせいか歪むとすぐに識別できていない気がする。

こんな感じで顔検出ができます。顔認識タスクとか、暇ができたら挑戦しようと思います。