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さん
なんかうまくいってる。
首をひねった顔とか、若干隠れている顔そして、アニメ画像は検出できないようです。
アニメ画像で遊びたいと思った皆さん、実はアニメ画像用の識別器があります。
nagadomi/lbpcascade_animeface · GitHubにおいてあります。これを取得しましょう。そして、再度、顔検出を行ってみます。
絵里ちゃん以外は検出できています。気のせいか歪むとすぐに識別できていない気がする。
こんな感じで顔検出ができます。顔認識タスクとか、暇ができたら挑戦しようと思います。