人脸识别-设计说明
人脸识别设计说明
开发环境:XP\win7+VS2008+OpenCV+Access数据库。
1、 建立人脸库模块:
主要执行的是void CdlgCreateFaceDB::OnBnClickedbtnopenimg()
可以从”静态图像”与”USB 摄像头视频”进行人脸检测,将检测到的人脸样本保存到ACCESS 数据库中,字段定义如下:
每个人最多只能采集十张人脸样本;
某人第一次入库时,要给其分配一个唯一ID 号,当入第二张人脸样本,输入ID 号,当光标离开“ID 输入框”时,自动中库中以“ID 号”为关键字进行信息查找。
具体方法,请看相关代码。
2、 人脸维护与分类器训练:
可以对人脸库中的人脸信息进行查找、修改与删除;
可以对某人的人脸样本进行删除;
训练PCA 分类器,分类器的信息保存在一个facedata.xml 文件中。
具体方法,请看相关代码。
3、 人脸识别:
可以从”静态图像”与”USB 摄像头视频”进行人脸检测与识别;
当进行单人脸识别时,识别结果出现在框中;
当进行单人脸识别时,识别结果直接出现在图像上;
可以调节相似阈值,越大则对相似性要求越高。
具体方法,请看相关代码。
一、 PCA 分类器的训练过程:
void CdlgFaceWF::OnBnClickedbtntrainfc()
1. 1 打开人脸数据库,从表tblFR_Train把人脸图像(做了直方图均衡处理) 与信息取出来,写入文本文件:Ldxtrain.txt
每一行为一张人脸的信息: ID 姓名 图像文件名
最后,调用这个函数进行训练分类器:learn("Ldxtrain.txt" );
二、 PCA 分类器的识别过程:
1、在初始化中,加载模型文件:BOOL CdlgFaceRec::OnInitDialog()
if ( !loadTrainingData( &trainPersonNumMat ) ) { } AfxMessageBox(" 提示:人脸识别库加载不成功, 请关上重启一下!" );
2、A 、待识别的人脸检测到了,且进行直方图均衡处理;
B 、计算待识别人脸的PCA 投影系统
cvEigenDecomposite( processedFaceImg, nEigens, eigenVectArr, 0, 0, pAvgTrainImg, projectedTestFace);
C 、KNN 搜索,且返回可信度:iNearest = findNearestNeighbor(projectedTestFace, &confidence);
nearest = trainPersonNumMat->data.i[iNearest];
D .识别结果
//str_mId.Format("%0.4f\n",confidence); str_mId.Format("%d\n",nearest); if (confidence>FaceTh) //可信度足够大时 { } else str_mName="Unknown" ; //sprintf_s(text, sizeof(text)-1, "Name: '%s'", personNames[nearest-1].c_str()); //str_mName=text; str_mName= personNames[nearest-1].c_str();