opencv例程之人脸检测

来源:互联网 发布:淘宝怎么用储蓄卡分期 编辑:程序博客网 时间:2024/05/20 17:42

人脸检测所用到的库函数如下

//从文件中打开对象

void* cvLoad( const char* filename, CvMemStorage* memstorage=NULL,              const char* name=NULL, const char** real_name=NULL );

//人脸检测用于打开训练数据,用法如:cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );

 

//从联级分类器中查找目标

 CvSeq* cvHaarDetectObjects( const CvArr* image, CvHaarClassifierCascade* cascade, CvMemStorage* storage, double scale_factor=1.1, int min_neighbors=3, int flags=0, CvSize min_size=cvSize(0,0) );

//直方图归一化

void cvEqualizeHist( const CvArr* src, CvArr* dst );//该方法能归一化图像亮度和增强对比度

下面是精简了的人脸检测代码

/**该代码为Opencv代码,来自博客http://blog.csdn.net/xlh145/**/#include<iostream>#include<cv.h>#include<highgui.h>using namespace std;CvHaarClassifierCascade*cascade;//训练器标识CvMemStorage* storage;CvCapture * capture;//相机标识IplImage * frame = 0; //标识摄像头中一帧的数据IplImage *image = 0; //待检测的图像char *windowname = "结果";void Draw_Object(IplImage* search){double scale = 1.3;//缩放图像的尺寸IplImage * gray = cvCreateImage(cvGetSize(search),search->depth,1);IplImage * small_gray = cvCreateImage(cvSize(cvRound(search->width/scale),cvRound(search->height/scale)),search->depth,1); //创建小的图片cvCvtColor(search,gray,CV_BGR2GRAY); //转换为灰度图cvResize(gray,small_gray); //缩放尺寸cvEqualizeHist(small_gray,small_gray);//直方图归一化cvClearMemStorage(storage);//清空储存器数据CvSeq* faces = cvHaarDetectObjects( small_gray, cascade, storage,                                            1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/,                                            cvSize(30, 30) );  //检测人脸//下面是显示所有检测的人脸的数据for(int i=0;i<faces->total;i++){CvRect* rect = (CvRect*)cvGetSeqElem(faces,i); //获得指定索引的矩形框CvPoint center; //中心坐标        int radius;//半径        center.x = cvRound((rect->x + rect->width*0.5)*scale);        center.y = cvRound((rect->y + rect->height*0.5)*scale);        radius = cvRound((rect->width + rect->height)*0.25*scale);        cvCircle( image, center, radius, CV_RGB(255,0,0), 3, 8, 0 ); //绘制检测到的位置}cvShowImage(windowname,image);cvReleaseImage(&gray);cvReleaseImage(&small_gray);}int main(){cascade = (CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_alt.xml", 0, 0, 0 ); //加载训练器样本    if( !cascade )    {        fprintf( stderr, "ERROR: 没有找到训练样本数据\n" );        return -1;    }capture = cvCaptureFromCAM(0); //打开相机if(capture) //打开相机成功{cvNamedWindow(windowname,1); //创建窗口storage = cvCreateMemStorage(0); //创建存储空间//循环获取图像while(true){if(!cvGrabFrame(capture)){break;}frame = cvRetrieveFrame( capture );if(!frame){break;}if(!image) //第一次需要创建image = cvCreateImage(cvGetSize(frame),frame->depth,frame->nChannels);if(frame->origin==IPL_ORIGIN_TL) cvCopy(frame,image);elsecvFlip(frame,image,0); //水平翻转Draw_Object(image);if(cvWaitKey(10)>0) break;}cvReleaseImage(&image);cvReleaseCapture(&capture);cvReleaseMemStorage(&storage);cvDestroyWindow(windowname);}return 0;}



 

原创粉丝点击