当前位置:首页 > FaceRecog程序文档
程序 文档
程序结构
整个工程可以分为3个部分:算法、功能和应用。 ?
算法部分
算法部分目前分为4个模块:人脸对齐、光照归一化、特征提取和选择、子空间降维,每个模块是一个项目,每个项目生成一个dll供功能部分显式调用。
? 功能部分
功能部分只有一个项目FaceMngr,该部分依赖于算法部分,实现人脸注册、训练、识别、导入/导出等具体功能。该项目生成一个dll供应用部分隐式调用。 ? 应用部分
人脸识别Demo.
另外,工程中还有一个项目tools,实现了一些整个工程都可能用到的函数,大部分与OpenCV有关。该项目生成一个dll供各部分隐式调用。
接口简介
1. 人脸对齐项目FaceAlign 该项目实现了两种算法: ? ?
bool InitAlign(CvSize *faceSz, void *detshape);
利用OpenCV 2.0自带的Haar Cascade函数进行人脸检测,将其结果作为对齐结果; 利用Yao Wei的asmlibrary (http://code.google.com/p/asmlibrary/) 检测出双眼坐标进行对齐;
初始化。输入一个初始化好的asm_shape指针,输出人脸尺寸,如果初始化失败(如缺少必须文件)则返回false.
bool GetFace(IplImage *pic8, CvMat *faceImg, bool useBuf);
输入8位图像,输出找到的最大的归一化人脸图像,如果没找到脸返回false. useBuf指示是否进行平滑以消除抖动。
void ReleaseAlign();
释放资源。
例子:
IplImage *img = cvLoadImage(\ CvSize faceSz; CvMat *faceImg = cvCreateMat(faceSz.height,faceSz.width,CV_8UC1);
static asm_shape detshape;
if(! InitAlign(&faceSz,(void*)&detshape)) return false; GetFace(img,faceImg,false); cvShowImage(\cvWaitKey(); ReleaseAlign();
2. 光照归一化项目LightPrep
该项目实现了同态滤波+直方图规定化算法。 主要函数有:
bool InitLight(CvSize imgSz);
初始化,输入人脸尺寸,初始化失败返回false.
void RunLightPrep(CvMat *faceImg8);
进行归一化,输入和输出均为8位图像faceImg8。
void ReleaseLight();
3. 特征提取和选择项目FaceFeature
该项目实现了1种特征:Gabor特征,并进行均匀采样,在频域计算,速度较快。 主要函数有:
int InitFeature(CvSize imgSize);
初始化,输入人脸尺寸,返回原始特征向量长度。
void GetFeature(CvArr *faceImg32, CvMat *ft32);
输入浮点图像,输出浮点原始特征列向量。
void ReleaseFeature();
例子:
if(!f.InitLight(m_faceSz)) return false; RunLightPrep(faceImg8);
featureSz = InitFeature(m_faceSz); if(m_featureSz == 0) return false;
tfaceImg32 = cvCreateMat(m_faceSz.height, m_faceSz.width, CV_32FC1); tfeature = cvCreateMat(m_featureSz, 1, CV_FT_FC1); cvConvertScale(faceImg8, tfaceImg32, 1.0/255); GetFeature(tfaceImg32, tfeature);
4. 子空间计算项目Subspace 该项目实现了Fisherface方法。 主要函数有:
int CalcSubspace(CvMat *inputs, int *trainIds);
训练、计算子空间,输入特征列向量排列成的矩阵inputs,和每一列对应的类别,将子空间存入dll文件内部的变量中。返回子空间维数。
int GetSubspaceDim();
返回子空间维数。
void Project(CvMat *inputs, CvMat *results);
投影,inputs 和results可以是向量或列向量排列成的矩阵。
double CalcVectorDist(CvMat *target, CvMat *query);
计算向量target和query之间的距离,如果特征维数大于,采用余弦距离的相反数(距离越小越相似);否则采用欧氏距离。
bool WriteDataToFile(ofstream &os); bool ReadDataFromFile(ifstream &is);
导入/导出子空间相关变量到文件。
void ReleaseSubspace();
5. 功能部分FaceMngr
该类显式调用上述四个dll(调用的方法见FaceMngr_load.cpp,显得有些繁琐,但我不知道是否有更好的用法),实现建立人脸库、训练、识别、导入/导出等具体功能。具体函数功能见程序头文件。
6. 演示程序frtest
该项目的功能是,对摄像头拍摄的或用户指定的图像,检测其中人脸,然后在已存储的人脸库中找到最匹配的人脸并显示。对注册、训练、识别和主界面分别建立一个类,通过消息处理函数与用户进行交互,利用多线程来实时显示图像。每个类的具体方法请见相应头文件中的注释。
闫轲
共分享92篇相关文档