稻草网

Android利用JavaCV实现人脸识别 (一)

          最近在做毕业设计,被大二接的一个项目给坑了,导致毕业设计要做一个移动端人脸识别考勤系统,而且人脸识别还不能直接用Face++之类的公司提供的接口,从OpenCV到JavaCV折腾了一大圈,终于把核心功能实现了,记录一下过程。

         人脸识别包含人脸检测+人脸识别两个部分,人脸检测可以用已经训练好的分类器进行检测,也可以自己用人脸库训练分类器进行检测(比如 ORL人脸库 ),对于人脸检测过程中获取到的人脸,利用算法提取特征并保存,如果该人脸特征已经保存过,则通过对比可以得知人脸身份,其中还涉及到图像的处理(如灰度化等),这里不做详细介绍。

         最开始从OpenCV入手,只搞清楚了人脸识别的整个流程,但在Android上的具体实现,对于我这样一个从来没接触过Android和人脸识别的人来说还是非常有难度。幸运的是,JavaCV官方给了一个非常好的例子,我可以在其基础上进行修改,实现自己需要的功能,项目地址可见  javacv-android-recognize

        下载javacv-android-recognize可以用 DownGit ,输入github地址即可下载项目,用Android Studio打开项目之前记得修改gradle-wrapper.properties版本,否则很容易卡在building Gradle project,由于项目比较新,所以一般情况下都可以顺利运行,界面如下图

《Android利用JavaCV实现人脸识别 (一)》      《Android利用JavaCV实现人脸识别 (一)》

         点击TAKE PHOTO可以对未训练的人脸进行图像提取,提取25张后,点击START TRAIN即可对人脸进行训练,也就是特征提取,下一次再识别该人脸时,屏幕上就会提示Y Know You的英文。

         该项目提供了用于人脸检测的分类器,储存在raw目录下的frontalface.xml文件中,提取的人脸和特征文件保存在/data/data/org.bytedeco.javacv.android.recognize.example/files/train_folder目录下,人脸图片命名格式为person1.x,x是1~25张图片的编号,1是传入的personId,通过personId可以将不同的人脸特征与身份相对应,但例子里personId固定为1,因此只能识别一个人的身份。人脸特征保存在yaml类型的文件中,默认名为eigenFacesClassifier.yml,这是因为例子默认采用EIGEN_FACES_CLASSIFIER算法。

          之后需要将人脸识别算法改成LBPHFaceRecognizer算法, 因为相对于EigenFaceRecognizer、FisherFaceRecognizer,该算法支持Update方法,也就是新增的人脸无需将整个人脸库全部重新训练一遍,非常适合我的毕业设计。三个算法具体区别请参考: https://blog.csdn.net/wjskeepmaking/article/details/71194927

       本篇只对javacv-android-recognize做了一个简单的介绍,该项目仅能保存及识别一张人脸,下一章我们将对其进行修改,使其能够识别出多个人脸的身份

  1. Mrvica7说道:

    有具体LBP算法的具体实现吗?蟹蟹!!

回复 Mrvica7 取消回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注