您的位置:首页 > 运维架构

opencv例程之人脸检测

2013-04-25 17:12 387 查看
人脸检测所用到的库函数如下

//从文件中打开对象

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: