人脸识别在当前广泛应用于日常生活的各个方面,随着技术的进步,将来人脸应用将会越来越深入到日常生活中来.作为开发者,我们应该掌握一些应用知识,本文介绍一种使用opecv自带的人脸算法,实现人脸简单的识别.该方法适用于,要求准确率不高的场景,比如签到.考勤等场景.本文简单介绍使用opencv进行人脸识别的思路及方法。
一.编程前准备:
使用opencv的人脸识别功能,需要将opencv_contrib模块加到opencv中去进行编译,已vs2015为例简单说一下方法.
第一步分别下载opencv源码及opencv_contrib模块源码,注意版本号一定要相同,否则会编译失败.
第二步CMake设置OPENCV_EXTRA_MODULES_PATH为opencv_contrib目录下的modules,比如设置为D:/teng/working/opencv_contrib-3.4/modules。
进行编译,编译成功后,在自己的工程中加入opencv_highgui345.lib
opencv_core345.lib
opencv_imgproc345.lib
opencv_imgcodecs345.lib
opencv_objdetect345.lib
opencv_videoio345.lib
opencv_face345.lib
工程里面加入这个几个库,就可以进行人脸识别了。同时记住这个目录下的文件D:\teng\working\opencv-3.4\data\haarcascades目录下的文件是opencv帮我们训练好的特征文件,我们可以利用它可以进行人脸识别、眼睛识别、人体识别、甚至表情识别。
二.开始编写代码实现人脸识别.
分成2个步骤,第一步是进行人脸训练.第二步是识别.
公共变量
CascadeClassifier face_cascade; //载入分类器
Ptr
初始化公共变量
if (!face_cascade.load("haarcascade_frontalface_alt.xml")) /////D:\teng\working\opencv-3.4\data\haarcascades 目录下的文件,我们选用的是人脸识别。
{
MessageBox( _T("Load haarcascade_frontalface_alt failed!") );
g_bRunning = FALSE;
}
int nRet = _taccess( _T("lpbhClass.xml"),0);//存放人脸的特征文件
if( 0 == nRet || EACCES == nRet )
g_lpbhClass = LBPHFaceRecognizer::load
else
g_lpbhClass = LBPHFaceRecognizer::create();//创建特变量,程序退出时把它保存成lpbhClass.xml文件,待下次程序启动调用它。
第一部分:训练人脸特征
可以理解为把人脸特征保存到变量g_lpbhClass中去,进行识别是就可根据输入的人脸图片查找出相应的人脸id.实现人脸识别。
训练用g_lpbhClass->update(g_images,g_labels);//用于有新数据加入
g_lpbhClass->train(g_images,g_labels);//
g_lpbhClass->save("lpbhClass.xml");//把数据保存成文件,下次打开程序时装载。
2个参数都是数组,长度要一致,分别为人脸图片和相对应的id值。识别时会返回相应的id值。
第二部:分人脸识别
使用函数 double confidence = 0.0;
g_lpbhClass->predict(matface,id,confidence);
进行识别,查看confidence值。改值表示置信距离,当大80时,认为无法识别人脸。id表示输入的matface人脸被识别为训练过的id值。