-
//opencv2检测人脸人眼的方法有很多,我试了集中,下面的程序得到的结果最准确。人可以随意动,只要摄像头可以,就没有问题。
-
-
-
#include "opencv2/objdetect/objdetect.hpp"
-
#include "opencv2/highgui/highgui.hpp"
-
#include "opencv2/imgproc/imgproc.hpp"
-
-
#include <iostream>
-
#include <stdio.h>
-
#include <opencv2/core/core.hpp>
-
using namespace std;
-
using namespace cv;
-
-
-
void detectAndDisplay( Mat frame );
-
-
-
String face_cascade_name = "haarcascade_frontalface_alt.xml";
-
String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
-
CascadeClassifier face_cascade;
-
CascadeClassifier eyes_cascade;
-
string window_name = "Capture - Face detection";
-
RNG rng(12345);
-
-
-
int main( int argc, const char** argv )
-
{
-
-
-
Mat frame;
-
-
-
if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };
-
if( !eyes_cascade.load( eyes_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };
-
-
-
CvCapture* capture=cvCaptureFromCAM(0);
-
-
if( capture )
-
{
-
while( true )
-
{
-
frame = cvQueryFrame( capture );
-
-
-
if( !frame.empty() )
-
{ detectAndDisplay( frame ); }
-
else
-
{ printf(" --(!) No captured frame -- Break!"); break; }
-
-
int c = waitKey(10);
-
if( (char)c == ‘c‘ ) { break; }
-
}
-
}
-
return 0;
-
}
-
-
-
void detectAndDisplay( Mat frame )
-
{
-
std::vector<Rect> faces;
-
Mat frame_gray;
-
-
cvtColor( frame, frame_gray, CV_BGR2GRAY );
-
equalizeHist( frame_gray, frame_gray );
-
-
-
face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );
-
-
for( size_t i = 0; i < faces.size(); i++ )
-
{
-
Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 );
-
ellipse( frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 2, 8, 0 );
-
-
Mat faceROI = frame_gray( faces[i] );
-
std::vector<Rect> eyes;
-
-
-
eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30) );
-
-
for( size_t j = 0; j < eyes.size(); j++ )
-
{
-
Point center( faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5 );
-
int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 );
-
circle( frame, center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 );
-
}
-
}
-
-
imshow( window_name, frame );
-
}
opencv2实现人脸及人眼检测_相当稳定
原文:http://blog.csdn.net/hanshuning/article/details/41865305