OpenCV를 이용한 얼굴 + 눈영역 검출
OpenCV에서 제공하는 Haartraining을 이용하여 직접 학습을 하여 검출을 하는 것이 좋지만,
기본적으로 제공하는 분류기를 이용해도, 어느정도의 성능은 나온다.
캠에서 영상을 받아와 Haar-like 특징을 이용하여 얼굴을 검출하고, 검출된 얼굴 영역 내에서 눈 영역을 검출하는것을 구현하였다.
분류기는 기본적으로 제공해주는 파일 사용! OpenCV폴더에 보면 있다.!
ㅋㅋㅋㅋㅋㅋ 아래 사진은 내 키스미 파우치...
얼굴은 녹색 사각형, 눈은 빨간색 사각형으로 그리도록 했다. 얼굴검출 사각형이 좀 크게 그려지긴 했지만,
실제 사람얼굴은 잘된다.ㅋㅋㅋ 밑에 소스첨부 ~
⁄⁄ Face Detection1.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다. ⁄⁄ #include "stdafx.h" #include <iostream> #include <opencv2⁄core⁄core.hpp> #include <opencv2⁄contrib⁄contrib.hpp> #include <opencv2⁄highgui⁄highgui.hpp> #include <opencv2⁄imgproc⁄imgproc.hpp> #include <opencv2⁄objdetect⁄objdetect.hpp> using namespace cv; using namespace std; int _tmain(int argc, _TCHAR* argv[]) { ⁄⁄haar xml분류기 const char *classifer = "C:⁄opencv 2.4.3⁄data⁄haarcascades⁄haarcascade_frontalface_default.xml"; const char *classifer1 = "C:⁄opencv 2.4.3⁄data⁄haarcascades⁄haarcascade_eye.xml"; CvHaarClassifierCascade* cascade_face = 0; cascade_face = (CvHaarClassifierCascade*) cvLoad(classifer, 0, 0, 0 ); CvHaarClassifierCascade* cascade_eye = 0; cascade_eye = (CvHaarClassifierCascade*) cvLoad(classifer1, 0, 0, 0 ); if(!cascade_face||!cascade_eye){ std::cerr<<"error: cascade error!!"<<std::endl; return -1; } CvMemStorage* storage_face = 0; storage_face = cvCreateMemStorage(0); CvMemStorage* storage_eye = 0; storage_eye = cvCreateMemStorage(0); if(!storage_face||!storage_eye){ std::cerr<<"error: storage error!!"<<std::endl; return -2; } ⁄⁄cam IplImage* image = 0; CvCapture* cap = cvCaptureFromCAM(0); cvNamedWindow("cam",0); cvResizeWindow("cam", 640,480); while(1) { cvGrabFrame(cap); image = cvRetrieveFrame(cap); ⁄⁄ face detection CvSeq *faces = 0; faces = cvHaarDetectObjects(image, cascade_face, storage_face, 2.0, 5, 0); ⁄⁄검출된 모든 face에 대한 반복문 for(int i=0; i<faces->total; i++){ ⁄⁄face 영역 가져오기 CvRect *r = 0; r = (CvRect*) cvGetSeqElem(faces, i); ⁄⁄frame에 face 영역 그리기 cvRectangle(image, cvPoint(r->x, r->y), cvPoint(r->x+r->width, r->y+r->height), cvScalar(0,255,0), 3, CV_AA, 0); CvRect rect; rect.x = r->x; rect.y = r->y; rect.width = r->width; rect.height = r->height; ⁄⁄ eye detection cvSetImageROI(image, rect); IplImage* fimg = cvCreateImage(cvSize(r->width, r->height), image->depth, image->nChannels); cvCopy(image, fimg); cvResetImageROI(image); CvSeq *eyes = 0; eyes = cvHaarDetectObjects(fimg, cascade_eye, storage_eye, 1.5, 5, 0); for(int j=0; j<eyes->total; j++){ CvRect *r1 = 0; r1 = (CvRect*) cvGetSeqElem(eyes, j); ⁄⁄frame에 eye 영역 그리기 cvRectangle(image, cvPoint(r1->x+r->x, r1->y+r->y), cvPoint(r1->x+r->x+r1->width, r1->y+r->y+r1->height), cvScalar(0,0,255), 3, CV_AA, 0); } cvReleaseImage(&fimg); } cvShowImage("cam", image); ⁄⁄ if(cvWaitKey(30)>=0) break; } cvReleaseMemStorage(&storage_face); cvReleaseMemStorage(&storage_eye); cvReleaseCapture(&cap); cvDestroyWindow("cam"); cvReleaseHaarClassifierCascade(&cascade_eye); cvReleaseHaarClassifierCascade(&cascade_face); return 0; }
'과거자료 > 컴퓨터비전' 카테고리의 다른 글
웹캠. 적외선 카메라 개조 (2) (3) | 2015.01.12 |
---|---|
웹캠. 적외선 카메라 개조 (1) | 2014.12.30 |
Face Recognition with OpenCV (0) | 2014.12.11 |
Face Detection - Modified Census Transform (MCT) Demo (1) | 2013.01.31 |
Visual Studio 2010 + OpenCV 2.4.3 설치 (0) | 2012.12.12 |