-
[OpenCV] Webcam을 이용해서 얼굴을 인식하는 간단한 예제Tech/Development 2013. 9. 13. 22:03
이전에 OpenCV를 이용해서 간단히 webcam에 접근하는 예제를 포스팅 한 적이 있는데, 기왕 웹캠을 띄웠으니 얼굴 인식도 추가해보기로 했다. 추가적으로 구현하는 것이 아니라 OpenCV에서 제공하는 함수를 가져다 쓰기만 하면 된다.
/* * @file ocv_cam_face.cc * @brief Face detection using OpenCV with Webcam * @author http://thinkpiece.tistory.com */ #include "opencv/cv.h" #include "opencv/highgui.h" #include <iostream> int main(int argc, char *argv[]) { // ------------------------------------------------------------------------- // webcam routine cv::VideoCapture capture(0); if( !capture.isOpened() ) { std::cerr << "Could not open camera" << std::endl; return 0; } // create a window cv::namedWindow("webcam",1); // ------------------------------------------------------------------------- // face detection configuration cv::CascadeClassifier face_classifier; face_classifier.load("haarcascade_frontalface_default.xml"); while (true) { bool frame_valid = true; cv::Mat frame_original; cv::Mat frame; try { capture >> frame_original; // get a new frame from webcam cv::resize(frame_original,frame,cv::Size(frame_original.cols/2, frame_original.rows/2),0,0,CV_INTER_NN); // downsample 1/2x } catch(cv::Exception& e) { std::cerr << "Exception occurred. Ignoring frame... " << e.err << std::endl; frame_valid = false; } if (frame_valid) { try { // convert captured frame to gray scale & equalize cv::Mat grayframe; cv::cvtColor(frame, grayframe, CV_BGR2GRAY); cv::equalizeHist(grayframe,grayframe); // ------------------------------------------------------------- // face detection routine // a vector array to store the face found std::vector<cv::Rect> faces; face_classifier.detectMultiScale(grayframe, faces, 1.1, // increase search scale by 10% each pass 3, // merge groups of three detections CV_HAAR_FIND_BIGGEST_OBJECT|CV_HAAR_SCALE_IMAGE, cv::Size(30,30)); // ------------------------------------------------------------- // draw the results for(int i=0; i<faces.size(); i++) { cv::Point lb(faces[i].x + faces[i].width, faces[i].y + faces[i].height); cv::Point tr(faces[i].x, faces[i].y); cv::rectangle(frame, lb, tr, cv::Scalar(0,255,0), 3, 4, 0); } // print the output cv::imshow("webcam", frame); } catch(cv::Exception& e) { std::cerr << "Exception occurred. Ignoring frame... " << e.err << std::endl; } } if (cv::waitKey(30) >= 0) break; } // VideoCapture automatically deallocate camera object return 0; }
OpenCV에서는 얼굴 인식을 위한 여러가지 템플릿을 이미 제공하고 있다. OpenCV가 설치된 폴더를 살펴보면 haarcascade classifier를 위한 여러가지
xml
파일들을 찾을 수 있을 것이다. 사용자가 직접 얼굴 데이터베이스를 기반으로 학습해놓지 않아도 얼추 잘 된다. 위 예제는 그 파일들 중haarcascade_frontalface_default.xml
을 사용한 예제. 이외에도alt
,alt2
,tree
등 몇가지 수식어가 붙은 버전들이 함께 제공된다. 아래는 수행결과.