// 人脸识别检测3.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
#include"stdlib.h"
#pragma comment(lib, "opencv_objdetect220d.lib")
static CvHaarClassifierCascade* cascade = 0;//定义全局变量cascade,瀑布级联分类器初始值,harr 分类器级联的内部标识形式
static CvMemStorage* storage = 0;
void detect_and_draw(IplImage* image);
const char* cascade_name = "haarcascade_frontalface_alt.xml";//人脸检测要用到的分类器
int _tmain(int argc, _TCHAR* argv[])
{
//加载人脸检测所用的分类器
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( "result",0);//CV_WINDOW_AUTOSIZE
IplImage* image = cvLoadImage( "G:22.jpg", -1); //加载图像
//对加载的图像进行检测
detect_and_draw( image );
cvWaitKey(0);
cvReleaseImage( &image );//释放所占用的内存。
cvDestroyWindow( "result");//销毁显示图像文件的窗口。
system("pause");
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);//分配存储空间,图像的宽,高,图像元素的位深度,通道选择(1-4)
IplImage* small_img = cvCreateImage( cvSize( cvRound (img->width/scale),cvRound( img->height/scale)),8,1);//cvRound四舍五入处理数据方法,对一个double型的数进行四舍五入,并返回一个整型数
cvCvtColor( img ,gray ,CV_BGR2GRAY);//灰度化函数(RGB图像通过其转换为灰度图像)
cvResize( gray,small_img ,CV_INTER_LINEAR);//对RGB图像进行大小的调整,small_img ,CV_INTER_NN
cvEqualizeHist( small_img, small_img );//对图像进行直方图均衡。它可以平衡亮度值。
cvClearMemStorage( storage );//清除内存
if( cascade )
{
//函数cvHaarDetectObjects检测图像中的目标,由OpenCV提供
CvSeq* faces = cvHaarDetectObjects(small_img, cascade, storage, 1.1, 2, 2, cvSize(30,30));//检测人脸,返回矩形人脸。最后一个2,可以赋值0-3,但是表示不同的意思。用0,降低了计算量,但是引起了性能降低。
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);
}