読者です 読者をやめる 読者になる 読者になる

craneの技術録

writeupとかいろいろ

顔検出プログラム(FaceDetection)

顔の特徴点を捉え、ロックオン!

OpenCVで顔検出してみた。

顔を中心に赤い丸が出力されます。

カスケードのディレクトリは、ご自身で選択してください。

以下、ソースプログラム (C++)

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <stdio.h>
#include <opencv2/opencv.hpp>

using namespace cv;

int main(int, char**)
{
cv::VideoCapture cap(0);
if (!cap.isOpened())
return -1;
cv::namedWindow("しゅつりょく1", 1);
std::string cascadeName = "C:/Program Files/OpenCV/sources/data/haarcascades/haarcascade_frontalface_default.xml";
cv::CascadeClassifier cascade;
if (!cascade.load(cascadeName))
return -1;

std::vector<cv::Rect> faces;

while (1)
{
cv::Mat frame;
cv::Mat input_image;
cv::Mat output_image;
cap >> frame;
cvtColor(frame, input_image, CV_BGR2GRAY); 
cv::equalizeHist(input_image, input_image);
output_image = frame; 
cascade.detectMultiScale(input_image, faces,
1.3, 2,
CV_HAAR_SCALE_IMAGE,
cv::Size(50, 50));
std::vector<cv::Rect>::const_iterator r = faces.begin();
for (; r != faces.end(); ++r) {
cv::Point center;
int radius;
center.x = cv::saturate_cast<int>*1;
center.y = cv::saturate_cast<int>*2;
radius = cv::saturate_cast<int>((r->width + r->height)*0.25);
cv::circle(output_image, center, radius, cv::Scalar(80, 80, 255), 3, 8, 0);

printf("faceID%d,x=%d,y=%d,width=%d,height=%d\n", r, r->x, r->y, r->width, r->height);
}
flip(output_image, output_image, 1);
imshow("しゅつりょく2", output_image);
if (cv::waitKey(27) >= 0) break;

}
return 0;
}

 

動画やスクリーンショットは、今度更新します。 (´・ω・`)

 

*1:r->x + r->width*0.5

*2:r->y + r->height*0.5