您的位置:首页 > 其它

人脸识别简单例子

2013-01-29 14:09 211 查看

#include <stdlib.h>

#include <stdio.h>

#include <math.h>

#include <opencv/cv.h>

#include <opencv/highgui.h>

static CvHaarClassifierCascade *cascade;// 加载分类器

static CvMemStorage *storage=0;// 保存图像内存

void detect_and_draw(IplImage *image);// 识别人脸重绘图像

const char *cascade_name="haarcascade_frontalface_alt.xml";// 分类器文件名称

int main(int argc, char *argv[])

{

IplImage* img = 0;// 图像指针

// 载入图像

img=cvLoadImage("Lena.jpg");

cascade = (CvHaarClassifierCascade *)cvLoad(cascade_name,0,0,0); //加载人脸检测所用的分类器

if( !cascade )

{

fprintf( stderr, "ERROR: Could not load classifier cascade\n" );

return -1;

}

storage = cvCreateMemStorage(0); //动态存储结构,用来存储人脸在图像中的位置

// 创建窗口

cvNamedWindow("mainWin", 1);

detect_and_draw(img);

// wait for a key

cvWaitKey(0);

// release the image

cvReleaseImage(&img );

cvDestroyWindow("mainWin");

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 );

cvCvtColor( img, gray, CV_BGR2GRAY );

cvResize( gray, small_img, CV_INTER_LINEAR );

cvEqualizeHist( small_img, small_img );

cvClearMemStorage( storage );

if( cascade )

{

/*函数cvHaarDetectObjects检测图像中的目标,由OpenCV提供。*/

CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage, 1.1, 2, 0 ,

cvSize(30, 30) );

for( int 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 );

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