OpenCV温故而知新: 人脸检测


应用场景

人脸侦测的应用非常广泛,但真正意义上来说,检测出人脸在日常生活中的意义并不是那么大(只有在诸如相机之类的应用中才被广泛应用),而从未来来讲,主要的方向将是人脸识别,即通过人脸图像识别出这个人是谁,但是这个难度就有点高了(我有找到过一个算法可以识别人,但准确度相当差),但要是做出来那必然前途无量(Facebook已经实现在这个功能,但目前仍在试用中),试想,现在的搜索都是文字搜索,未来必然将逐步发展到图像搜索,甚至视频搜索,那将会是怎样的一个世界???好了,不啰嗦了,呵呵。

工作原理

利用haar like来实现。利用haarcascade来进行计算检测(程序附带一个haarcascade_frontalface_alt.xml)。

补充说明

本算法在OpenCV的自带示例里有完整代码,你完全可以参考该代码进行学习和修改。

以下是接口说明。

全域类别说明:

class CFaceDetect{

private:

int initial_i;                                      //设定ROI起使y坐标

bool alarm;                                      //侦测到人脸时发出信号

bool face;                                               //前景面积超过能侦测到人脸大小时发出信号

CvMemStorage* storage;               //分类器储存空间

CvHaarClassifierCascade* cascade;      //训练好的分类器

 

const char* cascade_name ;                   //文件名称

CvPoint ROI_ltpt,ROI_rbpt;               //ROI左上点与右下点

CvRect ROI_reg;                                //设定ROI大小

int detect,detect2;                                 //侦测信号

int initial_y,initial_size;                        //face image大小与位置

int initial_y2,initial_size2;                     //face image大小与位置2

int last_size;                                          //face image最终大小

int length;                                        //同一个人两张face image间移动单位距离变化的大小

int nHeight,nWidth;                       //frame的宽与高

IplImage *frame_copy;                         //暂存frame

IplImage *Background;                         //背景frame

IplImage *Foreground;                          //前景frame

IplImage *Object;                                  //前景区域画面

int UpdateCount;                                   //计数更新frame

int count;                                                //计数frame

double face_area;                                  //启动人脸侦测的前景区块大小

CvScalar lo_diff,up_diff;

CvPoint seed_point;                      //着色起始点坐标

CvConnectedComp comp;                   //前景连续区域信息

CvRect PeopleReg;                                //人形区域

public:

CFaceDetect(int x,int y,int width,int height);    //建构子

~CFaceDetect();                                          //解构子

bool Alarm();       //由AP承接image package

bool BeginDetectFace();   //Whole algorithm

void UpdateBackgroundImage(int IntervalFrame, int select, double alpha);

//send the alarm information

void GetForeground( int background_thresh);

void BackgroundSubtraction(IplImage *img2);

void DetectAndDraw(IplImage *img );//判断是否已经设定background

};

成员函式说明:

CFaceDetect::CFaceDetect( int x,int y,int width,int height){

Purpose:initial image variables and ROI variables.

Usage :set all variable will use.

Parameter:

Parameter Type Description
x int x of left bottom point
y int y of left bottom point
width int width of ROI
height Int height of ROI

}

CFaceDetect::~CFaceDetect (){

Purpose:release variables

release all image variables

}

bool CFaceDetect::Alarm(){

Purpose: find face detected or not.

Usage: return true if face detected.

Return:

True, if face detected

False, otherwise

}

bool CFaceDetect::BeginDetectFace {

Purpose: find if foreground bigger than a minimum face image.

Usage: return true if foreground big enough.

Return:

True, if foreground big enough

False, otherwise

}

CFaceDetect::BackgroundSubtraction(IplImage *img2){

Purpose:Using Background Subtraction to reduce detecting region.

Usage :give current frame to get foreground.

Parameter:

Parameter Type Description
Img2 IplImage frame

}

CFaceDetect::UpdateBackgroundImage(int IntervalFrame, int select, double alpha){

Purpose:Building background at first and updating background after background built

Usage :Setting up parameter to update background

Parameter:

Parameter Type Description
IntervalFrame int Background count
select int Update or build background
alpha int Update ratio

}

CFaceDetect::GetForeground( int background_thresh){

Purpose:Getting Foreground after background built

Usage :Giving threshold to get foreground from frame

Parameter:

Parameter Type Description
background_thresh int Foreground threshold

}

 

CFaceDetect::DetectAndDraw(IplImage *img2){

Purpose:Detecting faces in foreground.

Usage :Giving frame than marked face in the frame

Parameter:

Parameter Type Description
Img2 IplImage frame

}

测试程序及序列

测试程序: http://rg4.net/p/easyiv/libfacedetect_test.7z

测试视频序列:http://rg4.net/p/easyiv/libfacedetect_sample.7z

测试程序说明:

  • 指定测试视频:libxxxdetect_test.exe 111.avi,这个111.avi是你输入的视频文件。若不指定则默认打开当前目录下的libxxxdetect_sample.avi文件,若这个文件不存在则打开电脑上的摄像头。
  • 开始后请先通过鼠标拖拉点选设置检测区域。
  • 附带文件:haarcascade_frontalface_alt.xml,请将其与程序放在同一目录下使用。
  • 测试程序快捷键:按r重新设定ROI检测区域,按p暂停处理,按t or ESC键中止。

Leave a comment

Your email address will not be published. Required fields are marked *