人脸识别在当前广泛应用于日常生活的各个方面,随着技术的进步,将来人脸应用将会越来越深入到日常生活中来.作为开发者,我们应该掌握一些应用知识,本文介绍一种使用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<LBPHFaceRecognizer> g_lpbhClass;

初始化公共变量

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<LBPHFaceRecognizer>("lpbhClass.xml");//如果存在特征文件,装载它
     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值。