应用场景
人脸侦测的应用非常广泛,但真正意义上来说,检测出人脸在日常生活中的意义并不是那么大(只有在诸如相机之类的应用中才被广泛应用),而从未来来讲,主要的方向将是人脸识别,即通过人脸图像识别出这个人是谁,但是这个难度就有点高了(我有找到过一个算法可以识别人,但准确度相当差),但要是做出来那必然前途无量(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键中止。