개발환경
사용툴 : Visual Studio 2013 라이브러리 : openCV library 2.4.11 프로젝트 : Visual C++ console application 개발날짜 : 2015-04-08 |
출처 : stackoverflow - opencv and C++:detect face in image [closed]
int FaceDetection::Haar_FaceDetection_Img(string filename) { // Global variables // Copy this file from opencv/data/haarscascades to target folder string face_cascade_name = "haarcascade_frontalface_alt.xml"; CascadeClassifier face_cascade; string window_name = "Capture - Face detection"; // Function main
// Load the cascade if (!face_cascade.load(face_cascade_name)) { printf("--(!)Error loading\n"); return (-1); };
// Read the image file Mat frame = imread(filename);
for (int i = 0; i < 1; i++) { // Apply the classifier to the frame if (!frame.empty()) { detectAndDisplay(frame, face_cascade, filename); } else { printf(" --(!) No captured frame -- Break!"); break; }
int c = waitKey(10);
if (27 == char(c)) { break; } } return 0; } // Function detectAndDisplay void FaceDetection::detectAndDisplay(Mat frame, CascadeClassifier face_cascade, string filename) { std::vector<Rect> faces; Mat frame_gray; Mat res; Mat gray; int filenumber = 0; // Number of file to be saved
cvtColor(frame, frame_gray, COLOR_BGR2GRAY); equalizeHist(frame_gray, frame_gray);
// Detect faces face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
// Set Region of Interest cv::Rect roi_b; cv::Rect roi_c;
size_t ic = 0; // ic is index of current element int ac = 0; // ac is area of current element
size_t ib = 0; // ib is index of biggest element int ab = 0; // ab is area of biggest element
for (ic = 0; ic < faces.size(); ic++) // Iterate through all current elements (detected faces)
{ roi_c.x = faces[ic].x; roi_c.y = faces[ic].y; roi_c.width = (faces[ic].width); roi_c.height = (faces[ic].height);
ac = roi_c.width * roi_c.height; // Get the area of current element (detected face)
roi_b.x = faces[ib].x; roi_b.y = faces[ib].y; roi_b.width = (faces[ib].width); roi_b.height = (faces[ib].height);
// Get the area of biggest element, at beginning it is same as "current" element ab = roi_b.width * roi_b.height;
if (ac > ab) { ib = ic; roi_b.x = faces[ib].x; roi_b.y = faces[ib].y; roi_b.width = (faces[ib].width); roi_b.height = (faces[ib].height); }
Point pt1(faces[ic].x, faces[ic].y); // Display detected faces on main window - live stream from camera Point pt2((faces[ic].x + faces[ic].height), (faces[ic].y + faces[ic].width)); rectangle(frame, pt1, pt2, Scalar(0, 255, 0), 2, 8, 0); }
// Show image imshow("original", frame); } |
결과화면
'Computer Vision > Face Detection' 카테고리의 다른 글
[Face Detection] 기술 소개 (0) | 2015.04.17 |
---|---|
[Face Detection] 얼굴인식 알고리즘의 종류와 설명 (0) | 2015.04.16 |
[Face Detection] gpu를 사용한 동영상 얼굴인식 (0) | 2015.04.15 |
[Face Detection] 동영상 얼굴검출 후 모자이크처리 (4) | 2015.04.09 |
[Face Detection] Haar Cascade를 사용한 동영상 얼굴검출 (0) | 2015.04.08 |