#はじめに
1週間前にOpenCVを始めてからハマりっぱなしですww
今回はOpenCVを用いて顔検出を行ってみます.
※まだOpenCV超初心者なので間違いなどあればご指摘ください
#環境
- OpenCV v3.4.2
- VisualStudio2017
- 顔検出に用いるカスケード分類器(ここからダウンロードしてください)
※正面の顔を検出するカスケード分類器は,上記のGitHubからダウンロードしたファイルの
"opencv-master\opencv-master\data\haarcascades"の中に入っている【haarcascade_frontalface_alt.xml】を使います.
#ソースコード
detectFace.cpp
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <vector>
using namespace cv;
using namespace std;
int main()
{
CascadeClassifier cascade;
cascade.load("ファイルまでのパス/haarcascade_frontalface_alt.xml"); //正面顔情報が入っているカスケードファイル読み込み
Mat img = imread("ファイルまでのパス/lena.jpg", IMREAD_UNCHANGED); //入力画像読み込み
vector<Rect> faces; //輪郭情報を格納場所
cascade.detectMultiScale(img, faces, 1.1, 3, 0, Size(20, 20)); //カスケードファイルに基づいて顔を検知する.検知した顔情報をベクトルfacesに格納
for(int i = 0; i<faces.size(); i++) //検出した顔の個数"faces.size()"分ループを行う
{
rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), Scalar(0, 0, 255), 3, CV_AA); //検出した顔を赤色矩形で囲む
}
imshow("detect face", img);
waitKey(0);
}
#出力画像
以下のように出力されました.正常に顔を検出できていますね.
#おまけ
他の画像でも顔検出を行ってみました.
やっぱり顔が少し横に向くと検出が難しくなるみたいですね.
#おわりに
次はUSBカメラで撮影した動画に対してリアルタイムで顔検出を行う予定です.
実装しました!よかったら合わせて読んでください↓↓
【初心者向け】USBカメラで撮影した動画をリアルタイムで顔検出