用opencv自带的Haar分类器进行人脸检测(二)
来源:互联网 发布:淘宝售后工作怎么样 编辑:程序博客网 时间:2024/05/21 12:47
#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> #ifdef _EiC #define WIN32 #endif static CvMemStorage* storage = 0; static CvHaarClassifierCascade* cascade = 0; void detect_and_draw( IplImage* image ); const char* cascade_name = "haarcascade_frontalface_alt.xml"; /* "haarcascade_profileface.xml";*/ int main( int argc, char** argv ) { CvCapture* capture = 0; IplImage *frame, *frame_copy = 0; int optlen = strlen("--cascade="); const char* input_name; if( argc > 1 && strncmp( argv[1], "--cascade=", optlen ) == 0 ) { cascade_name = argv[1] + optlen; input_name = argc > 2 ? argv[2] : 0; } else { cascade_name = "D:\\Program Files\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt_tree.xml"; input_name = argc > 1 ? argv[1] : 0; } cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 ); 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); if( !input_name || (isdigit(input_name[0]) && input_name[1] == '\0') ) capture = cvCaptureFromCAM( !input_name ? 0 : input_name[0] - '0' ); else capture = cvCaptureFromAVI( input_name ); cvNamedWindow( "result", 1 ); if( capture ) { for(;;) { if( !cvGrabFrame( capture )) break; frame = cvRetrieveFrame( capture ); if( !frame ) break; if( !frame_copy ) frame_copy = cvCreateImage( cvSize(frame->width,frame->height), IPL_DEPTH_8U, frame->nChannels ); if( frame->origin == IPL_ORIGIN_TL ) cvCopy( frame, frame_copy, 0 ); else cvFlip( frame, frame_copy, 0 ); detect_and_draw( frame_copy ); if( cvWaitKey( 10 ) >= 0 ) break; } cvReleaseImage( &frame_copy ); cvReleaseCapture( &capture ); } else { const char* filename = input_name ? input_name : (char*)"10.jpg"; IplImage* image = cvLoadImage( filename, 1 ); if( image ) { detect_and_draw( image ); cvWaitKey(0); cvReleaseImage( &image ); } else { /* assume it is a text file containing the list of the image filenames to be processed - one per line */ FILE* f = fopen( filename, "rt" ); if( f ) { char buf[1000+1]; while( fgets( buf, 1000, f ) ) { int len = (int)strlen(buf); while( len > 0 && isspace(buf[len-1]) ) len--; buf[len] = '\0'; image = cvLoadImage( buf, 1 ); if( image ) { detect_and_draw( image ); cvWaitKey(0); cvReleaseImage( &image ); } } fclose(f); } } } cvDestroyWindow("result"); 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.0; //越大越快,过大或过小都会误检 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(20, 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 ); }
0 0
- 用opencv自带的Haar分类器进行人脸检测(二)
- 用opencv自带的Haar分类器进行人脸检测(一)
- opencv自带的haar分类器进行人脸识别
- 用opencv自带的haar方法进行人脸识别并切割
- 基于Haar分类器的OpenCV人脸检测实例
- opencv人脸检测(haar特征+AdaBoos分类器)(二)
- 【OpenCV学习笔记】3:OpenCV自带的Haar特征人脸检测
- OpenCV学习记录(二):自己训练haar特征的adaboost分类器进行人脸识别
- 用OpenCV自带的haar training程序训练分类器并测试
- 【人脸检测】OpenCV中的Haar+Adaboost级联分类器分解(一):Haar特征介绍
- 如何利用OpenCV自带的haar training程序训练分类器分类
- 使用OpenCV自带的级联分类器进行目标检测
- 【OpenCV】浅析人脸检测之Haar分类器方法
- matlab自带的分类器对人脸、鼻子、嘴进行检测
- 用opencv自带的traincascade.exe训练给予haar特征和LBP特征的分类器
- 目标检测之训练opencv自带的分类器
- 如何利用OpenCV自带的haar training程序训练分类器
- 如何利用OpenCV自带的haar training程序训练分类器
- 用Model-View-ViewModel构建iOS App
- linux日常使用命令
- IntelliJ IDEA中怎么查看方法说明
- 常用数据结构总结
- org.hibernate.hql.internal.ast.QuerySyntaxException: table is not mapped
- 用opencv自带的Haar分类器进行人脸检测(二)
- eclipse无法连接到makertplace
- 几种可以实现在不同设备动态正常显示表格数据的方式
- const int *a and int *const a and const int * const a
- 获取屏幕截图--笔记
- (译)Python关键字yield的解释(stackoverflow)
- Android 自定义View制作方法
- LA 2678(p48)----Subsequence
- 欢迎使用CSDN-markdown编辑器