#include <cv.h>
#include <cvcam.h>
#include <cxcore.h>
#include <highgui.h>
#include <stdlib.h>
#include <stdio.h>
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cvcam.lib")
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"highgui.lib")
CvMemStorage *storage=NULL;
CvHaarClassifierCascade *cascade=NULL;
char *filename="1.jpg";
void detect_and_draw( IplImage* image );
void main()
{
printf("输入 m 用以 获取头像/n");
//创建摄像头capture对象
CvCapture *capture=cvCreateCameraCapture( CV_CAP_ANY);
if (NULL==capture) return;
//创建用以指向所处理图像的指针
IplImage *image=cvQueryFrame(capture);
if (NULL==image) return;
//用以初始化cascade对象
storage=cvCreateMemStorage(0);
assert(storage!=NULL);
cascade=(CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_alt2.xml",NULL,NULL,NULL);
assert(storage!=NULL);
//创建窗口
cvNamedWindow("Show_Result");
cvNamedWindow("Show_Head");
//如果获取图像成功进入循环执行detect_and_draw函数
while ((image=cvQueryFrame(capture))!=NULL)
{
detect_and_draw(image);
if (27==cvWaitKey(30))
{
break;
}
}
}
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}}
};
IplImage *dst_image_head=NULL;
IplImage *dst_image_head_gray=NULL;
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 );
//在图像上画出脸的部位
cvDrawRect(img,cvPoint(r->x*scale,r->y*scale),cvPoint((r->x+r->width)*scale,(r->y+r->height)*scale),CV_RGB(0,255,0),1);
//单独将人脸信息提取出来,前者为实际图像,后者做这方图均衡化使用
IplImage *dst_image_head=cvCreateImage(cvSize(r->width*scale,r->height*scale),img->depth,img->nChannels);
IplImage *dst_image_head_gray=cvCreateImage(cvGetSize(dst_image_head),IPL_DEPTH_8U,1);
//设置感兴趣区域将人脸部分 提取出来
cvSetImageROI(img,cvRect(r->x*scale,r->y*scale,(r->width)*scale,(r->height)*scale));
cvCopy(img,dst_image_head);
cvResetImageROI(img);
//旋转脸部图像
cvFlip(dst_image_head,dst_image_head,0);
//将提取的图像转换成灰度,以便指向直方图均衡化
cvCvtColor(dst_image_head,dst_image_head_gray,CV_BGR2GRAY);
//如果输入执行直方图均衡化,并显示出来
char c=cvWaitKey(1);
if ('m'==c || 'm'==c)
{
cvEqualizeHist(dst_image_head_gray,dst_image_head_gray);
cvShowImage("Show_Head",dst_image_head_gray);
}
//
}
}
cvShowImage( "Show_Result", img );
// cvShowImage("Show_Head",dst_image_head);
cvReleaseImage( &gray );
cvReleaseImage( &small_img );
}