OpenCV_人脸检测
利用OpenCV自带的人脸识别库haarcascade_frontalface_alt.xml进行人脸识别测试
demo如下:
#include "cv.h" #include "highgui.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <math.h> #include <float.h> #include <limits.h> #include <time.h> #include <ctype.h> using namespace std; static CvMemStorage* storage = 0; static CvHaarClassifierCascade* cascade = 0; void detect_and_draw( IplImage* image ); const char* cascade_name ="F:/ProgramFiles/opencv246/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml"; //opencv自带人脸识别训练结果 /* "haarcascade_profileface.xml";*/ int main() { CvCapture* capture = 0; cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );//加载opencv自带人脸识别训练结果 if( !cascade ) { fprintf( stderr, "ERROR: Could not load classifier cascade/n" ); //fprintf( stderr, //"Usage: facedetect --cascade=/"<cascade_path>"/[filename|camera_index]/n" ); return -1; } storage = cvCreateMemStorage(0); cvNamedWindow( "result", 1 ); const char* filename = "people.jpg"; IplImage* image = cvLoadImage(filename ); //加载图像 if( image ) { detect_and_draw( image ); cvWaitKey(0); cvReleaseImage( &image ); } cvDestroyWindow("result"); cvWaitKey(0); return 0; } void detect_and_draw( IplImage* img ) //检测人脸并画出区域 { static CvScalar colors[] = //随机生成颜色序列 { {{0,0,255}}, {{0,128,255}}, {{0,255,255}}, {{0,255,0}}, {{255,128,0}}, {{255,255,0}}, {{255,0,0}}, {{255,0,255}} }; double scale = 1.3; IplImage* gray = cvCreateImage( cvSize(img->width,img->height), 8, 1 ); IplImage* small_img = cvCreateImage( cvSize( cvRound (img->width/scale), cvRound (img->height/scale)),8, 1 ); int i; cvCvtColor( img, gray, CV_BGR2GRAY );//彩色图转化为灰度图 cvResize( gray, small_img, CV_INTER_LINEAR ); //利用线性插值算法归一化图像 cvEqualizeHist( small_img, small_img ); //直方图均衡化 cvClearMemStorage( storage ); if( cascade ) { double t = (double)cvGetTickCount(); CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage, 1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/, cvSize(30, 30) ); t = (double)cvGetTickCount() - t; printf( "detection time = %gms/n", t/((double)cvGetTickFrequency()*1000.) ); //统计人脸定位所用时间 for( i = 0; i < (faces ? faces->total : 0); i++ ) { CvRect* r = (CvRect*)cvGetSeqElem( faces, i ); CvPoint center; int radius; center.x = cvRound((r->x + r->width*0.5)*scale); //圆心 center.y = cvRound((r->y + r->height*0.5)*scale); radius = cvRound((r->width + r->height)*0.25*scale); //半径 cvCircle( img, center, radius, colors[i%8], 3, 8, 0 ); //用圆形圈出人脸区域 } } cvShowImage( "result", img ); cvReleaseImage( &gray ); cvReleaseImage( &small_img ); }效果图: