opencv例程之人脸检测

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

//从文件中打开对象

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);
			else
				cvFlip(frame,image,0); //水平翻转
			Draw_Object(image);
			if(cvWaitKey(10)>0) break;
		}
		cvReleaseImage(&image);
		cvReleaseCapture(&capture);
		cvReleaseMemStorage(&storage);
		cvDestroyWindow(windowname);

			
	}
	return 0;
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值