您的位置:首页 > 编程语言

OpenCV编程->haar+adaboost识别源码

2014-04-10 10:01 363 查看
贴一个可以运行的代码,供后面项目用:
// haarbody.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "iostream" #include "cv.h" #include "highgui.h" #include <stdio.h> #include <ctype.h> #include "cxcore.h" #include "cvaux.h"     #pragma comment(lib,"cxcore210d.lib") #pragma comment(lib,"cvaux210d.lib") #pragma comment(lib,"cv210d.lib") #pragma comment(lib,"highgui210d.lib")  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=0, *frame_copy = 0; 	//CvVideoWriter* writer=0; 	int optlen = strlen("--cascade="); 	const char* input_name; 	int c;   	if( argc > 1 && strncmp( argv[1], "--cascade=", optlen ) == 0 ) 	{ 		cascade_name = argv[1] + optlen; 		input_name = argc > 2 ? argv[2] : 0;// 	} 	else 	{ 		cascade_name = "haarcascade_frontalface_alt.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 = cvCaptureFromFile( input_name );   	cvNamedWindow( "result", 1 );  	// writer=cvCreateVideoWriter("f:\\test.avi",CV_FOURCC('P','I','M','1'),25,cvSize(400,250),1);  	while(1) 	{  		frame = cvQueryFrame( 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 );  		//cvWriteFrame(writer,frame_copy);  		c=cvWaitKey(20); 		if(c==27) 		{ 			break; 		} 		//cvSaveImage("d;\\1.jpg", frame); 	}  	cvDestroyWindow("result"); 	cvReleaseImage( &frame_copy ); 	cvReleaseCapture( &capture );  	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 );  	//cvWaitKey(0);  	cvReleaseImage( &gray ); 	cvReleaseImage( &small_img ); }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: