EzFaceRecognizer – a simple implementation of face recognition

One of my EasyIV project’s featured function is face detect, but obviously it was only used to collect faces for further process, like face recognition, of some other application or system working along with EasyIV.

I’d say here, face recognition was also included in my plan for EasyIV.

However, after digged into it for sometime, I found it’s really a big problem to me. I tried several ways to implement the face recognition process, but all the results are sad, none of the can work precisely.

P.S. Lucky me, I didn’t bring this topic to my paper, otherwise I’ll be doomed in the coming Mid-term examination.

Here I share with you a simple test program I used to practice face recognition by using Eigenface.

What is Eigenface?

Eigenfaces is the name given to a set of eigenvectors when they are used in the computer vision problem of human face recognition.[1] The approach of using eigenfaces for recognition was developed by Sirovich and Kirby (1987) and used by Matthew Turk and Alex Pentland in face classification.[2] The eigenvectors are derived from the covariance matrix of the probability distribution over the high-dimensional vector space of face images. The eigenfaces themselves form a basis set of all images used to construct the covariance matrix. This produces dimension reduction by allowing the smaller set of basis images to represent the original training images. Classification can be achieved by comparing how faces are represented by the basis set.

人体运动目标的检测与跟踪

人体运动目标的检测与跟踪技术是计算机视觉的主要研究方向之一,在生物医学,人机交互,虚拟现实,智能安全监控,机器人技术,图像压缩,计算机图形学等领域都有着广泛的应用。

运动目标的检测就是从视频流中去除静止的背景,检测出运动的目标及携带的运动信息,运动目标的检测对跟踪等后期处理非常关键[1]。目前,运动目标的检测方法主要有四种:背景差分法、帧间差分法、光流法、基于特征的方法。

现有的目标跟踪方法主要有两类:一类是基于相关的目标跟踪。这是一种先检测后跟踪的方法,它适用于目标之间相互作用较小和背景较简单的情况 ;另一类是基于特征的目标跟踪。这是一种先跟踪后检测的方法,跟踪的结果需要检测来校正[2]。 Continue reading “人体运动目标的检测与跟踪”

OpenCV温故而知新: 人跌倒侦测

应用场景

跌倒侦测主要应用于针对老人、小孩的住家看护之类的场景,如:家里的,或者养老院的老人。一旦出现跌倒,必须做到一定的反应。

工作原理

利用背景差检测画面的差异,并检测差异部分是否接近、类似人形。

补充说明

由于本算法对其应用场景有一定的特殊要求,若是放到不太合适的地方容易出现许多误报的状况。

以下是接口说明。

Continue reading “OpenCV温故而知新: 人跌倒侦测”

OpenCV温故而知新: 人脸检测

应用场景

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

工作原理

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

补充说明

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

以下是接口说明。 Continue reading “OpenCV温故而知新: 人脸检测”

OpenCV温故而知新: 入侵侦测

应用场景

入侵侦测通常可被广泛用于诸如禁行区域的非法进入,如:私家住宅、限制区域、军事区的非法进入等情景。检测对象为人物。

工作原理

预先设置一条线性区域,然后在该区域内检测移动人物,看是否有人物穿越。

补充说明

本算法容易受到穿越人物大小及穿越角度的影响,人体大小参数可设,但若是设置过大容易检测不到小物体,设置过小,则容易误报。通常需配合警报录像来工作,以实现实时的检测和事后的排查及过滤。注意:镜头视野(焦距)的大小也会影响检测的准确度。

使用者操作:
1.在视窗点选实体围墙的上面两角(顺序:左→右)
2.调整Threshold的大小:如果产生的FG杂讯太多,此时可以试着调高Threshold
3.调整pattern的大小:尽量让蓝色框包含整个人形

影片场景预设:
1.实体围墙,墙高至少要到成年人肩膀以上
2.摄影机的拍摄角度和围墙的法向量夹角不能超过45度以上
3.摄影机架设的高度约2.5公尺至3.5公尺左右
4.调整实体围墙分隔线最好是在画面1/2处左右

Continue reading “OpenCV温故而知新: 入侵侦测”

OpenCV温故而知新: 异常对象侦测

这个异常对象侦测通常可被广泛用于诸如银行ATM机上的非法广告张贴等情景,但是同其他的一些算法一样,容易受到一些客观条件的干扰,如:灯光、光线,物体形状,物体大小等等,我们可以对这些参数做设置和配置,但是在各种不同的情景和场景下,仍然有比较大的误报可能性。

同时考虑到可能的误报,侦测背景也是做成了逐渐腐蚀渗透,即,一旦发生报警,而没有人去处理(可能是误报),就直接将该区域混合到计算背景中,以期在最大程度上降低误报的可能性(如:因白天的光亮度和晚上光亮度不一样而导致的整体误报)。 Continue reading “OpenCV温故而知新: 异常对象侦测”

OpenCV温故而知新: 人流统计

应用场景

人流统计主要被广泛应用于一些商场,或者步行街等与人流相关的商业活动场所,这也是以人流来评价一个地方(或者是在一定时间内)的商业价值的一个重要手段。除这个人流统计之外,其实还有一个类似的算法是车流统计,车流统计主要用于高速公路或者马路。但从算法实现、技术角度来讲,这二者其实并没有太大的差别。

补充说明

本算法在OpenCV的自带示例里有完整代码,你完全可以参考该代码进行学习和修改。 Continue reading “OpenCV温故而知新: 人流统计”

OpenCV温故而知新: 遺失物偵測

函式功能规格

全域类别说明:

class CLostDetect{

private:

int         nAlarmFlag         ;                    //警告之flag

int         nWidth, nHeight ;                    //Frame之宽高

int         nAlarmTimer              ;                    //警告时间

 

bool      bEgdeDen           ;                    //edge density的变数

bool      bObjectSetted            ;                    //侦测物是否设定

int         nHdims               ;                    //Histogram维度变数

float      pHranges_arr[2]  ;                    //Histogram范围大小

float      *pHranges           ;

CvRect cvRectObjectWinodw       ;             //设定选取对象之框的变量

CvHistogram *pRHist                   ;             //计算R & G & B之histogram

CvHistogram *pGHist                    ;

CvHistogram *pBHist                    ;

IplImage *pCurFrame                            ;     //input image

IplImage *pGray                             ;      //color to gray

IplImage *pEdge                                 ;      //edge image

IplImage *pObjectImageModel            ;      //for rotate 0

IplImage *pObjectImageModel1          ;      //for rotate 15 degree

IplImage *pObjectImageModelMinus1       ;      //for rotate-15 degree

public:

CLostDetect(int width, int height, int alarmerTimer);                            //建构子

~CLostDetect();                                                                        //解构子

bool Reset() { bObjectSetted = false; return true;};                  //把bObjectSetted设为false

bool SetImage(BYTE* pImageArray);                                             //承接AP所传入的变量型态

bool SetImage(IplImage *pImage);                                           //whole algorithm

bool SetObject(IplImage *pImage, int x, int y, int width, int height);

//设定object model

int   GetObjectState();                                                               //计算edge density

bool Alarm() {return (nAlarmFlag>nAlarmTimer); };               //send alarm message

};

成员函式说明:

CLostDetect::CLostDetect(int width, int height, int nSeconds=5){

Purpose: initial all variables we’ll use the program

Usage: set all variable will use.

Parameter:

Parameter

Type

Description

width

int

the width of frame

height

int

the height of frame

nSeconds

int

alarm time set to 5

}

CLostDetect::~CLostDetect(){

Purpose: release variables

release all image variables

release both Hist variables

}

bool CLostDetect::SetImage(BYTE* pImageArray){

Purpose: Succeed to AP’s package to IplImage data type variable.

Usage: While webcam give image data into the program, check it data type.

Parameter:

Parameter

Type

Description

pImageArray BYTE Succeed input data type

Return:

True, if success

False, otherwise

}

bool CLostDetect::SetImage(IplImage *pImage){

Purpose: detect whether the lost happened.

Usage: While AP given the right data type, starting the algorithm of detection

Parameter:

Parameter

Type

Description

PImage IplImage If the input data is not NULL, starting to go the process

Return:

True, if success

False, otherwise

}

bool CLostDetect::SetObject(IplImage *pImage, int x, int y, int width, int height){

Purpose: set the object model.

Usage: given image frame, object position, width and height, return bool variable.

Parameter:

Parameter

Type

Description

pImage

IplImage

input image variable

x

int

Position of x

y

int

Position of y

width

int

Width of frame

height

int

Height of frame

Return:

True, if success

False, otherwise

}

int CLostDetect::GetObjectState(){

Purpose: After setting object model, quantify the object model edge density.

Usage: compute the edge density of object model.

Return:

0 when the procedure finished

}

测试程序及序列

测试程序: http://rg4.net/p/easyiv/liblostdetect_test.7z。测试程序快捷键:按r重新设定ROI检测区域,按p暂停处理,按t中止。

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

 

OpenCV温故而知新: 画面遮蔽功能实现

应用场景

画面遮蔽侦测主要应用于一些强制性开放的视频地点,如:煤矿矿产区,或者是一些特定的娱乐场所,这些视频在一些时候通常是要作为“现场证据”来呈现的,而有人的却可能由于各种原因,不想让视频给录下来…这个模块的目标就是检测出画面遮蔽,并告警通知相关人员去进行必要的处理。

工作原理

先将视频进行灰度处理,然后进行背景、前景差检测画面的差异,并检测差异部分是否是大片连续的,若是则认为画面被遮蔽。

补充说明

由于本算法对其应用场景有一定的特殊要求,若是放到不太合适的地方容易出现许多误报的状况。

以下是接口说明。

函式功能规格说明

全域类别说明

class CMaliciousDetect{

private:

bool bAlarmFlag;                                   //发出警告的bool variable

int nAlarmTimer;                             //警告时间

int nWidth, nHeight;                       //Frame之宽高

bool IsSetted;                                         //background是否设定变量

IplImage *Frame;                                   //input image

IplImage *Gray;                             //把input image转换成gray level

IplImage *C_edge;                       // The edge value image

IplImage *BG_edge;

IplImage *_small;                                //resize C_edge to _small

IplImage *BG_small;                            //       BG_edge to _small

CvHistogram *BG_hist,*C_hist;          //计算histogram for 变量BG_hist & C_hist

int hist_size ;                                         //设histogram之纵轴范围

CvScalar  num1 , num2 ;                     //计算BG_small&_small的edge value

int WCount;                                          //出现warning的时间变量

int OCount;                                     //发生状况一的遮蔽,计算秒数的变量

int ECount;                                     //发生状况二的遮蔽,计算秒数的变量

int HCount;                                     //发生状况三的遮蔽,计算秒数的变变

int H_HT ;                                       //histogram high and low threshold

int H_LT ;

double HistDiff;                                   //the difference of BG_hist & C_hist

public:

CMaliciousDetect( int nImageWidth, int nImageHeight, int nSeconds );  //建构子

~CMaliciousDetect();                                                                        //解构子

bool SetImage(BYTE *pImageArray);  //由AP承接image package

bool SetImage(IplImage *pImage);       //Whole algorithm

bool Alarm() {return bAlarmFlag;};      //send the alarm information

void ResetSystem() {IsSetted = false;};//判断是否已经设定background

};

成员函式说明:

CMaliciousDetect::CMaliciousDetect(int nImageWidth, int nImageHeight, int nSeconds){

Purpose:initial image variables and Hist variables.

Usage :set all variable will use.

Parameter:

Parameter Type Description
nImageWidth int the width of frame
nImageHeight int the height of frame
nSeconds int alarm time

}

CMaliciousDetect::~CMaliciousDetect(){

Purpose:release variables

release all image variables

release both Hist variables

}

bool CMaliciousDetect::SetImage(BYTE* pImageArray){

Purpose: Succeed to AP’s package.

Usage: While webcam give image data into the program, check it data type.

Parameter:

Parameter

Type

Description

pImageArray BYTE input data type

Return:

True, if success

False, otherwise

}

bool CMaliciousDetect::SetImage(IplImage *pImage){

Purpose: detect whether the occlusion happened.

Usage: While AP given the right data type, starting the algorithm of detection

Parameter

Parameter

Type

Description

PImage IplImage If the input data is not NULL, starting to go the process

Return:

True, if success

False, otherwise

}

测试程序及序列

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

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

Code review: Using Haarcascade to implement “passenger flow statistics”.

Using haarcascade_frontalface_alt to implement “passenger flow statistics”.

The detail flow chart of the major implementation

passenger flow statistics
passenger flow statistics flow chart

Sample test program:http://rg4.net/p/easyiv/passenger_flow_statistics.7z

Sample video: http://rg4.net/p/easyiv/passenger_flow_statistics.avi

BTW: This video file is temporary unavailable due to the my blog’s space limitation, I’m looking for a hosting with larger hard disk space and fair price.