概述
做了一个人脸检测的App,整理出来分享一下。这篇人脸检测是基于OpenCV来实现的。OpenCV是一个强大的跨平台计算机视觉库,至于多强大,自行百度。我们这边主要介绍的是OpenCV4Android。
。
4.编译文件生成so库
完成以上操作后,在terminal中进入jni目录下,手敲ndk-build即可完成编译(项目的ndk)
完成编译后就会出现libs文件夹,里面就有我们需要的库了。
5.移植samples中代码
从facedetect中将java文件和布局文件拷到自己的工程中来即可,lbpcascade_frontalface.xml是人脸特征库,直接用就好了,想了解的百度一下Haar、LBP特征。
运行起来就可以实现实时的人脸识别了。
效果展示
这边只局限于正脸(因为只用了正脸的特征,侧脸的自行更改特征文件),效果还行吧,没有对图片做任何处理,明暗程度对人脸检测的影响还是很大的。
代码简析
简单讲一下代码,首先是opencvlibrary的初始化,如果没有做上面的so包编译,就需要额外安装一个opencv manager的app(具体没试过);因为我们这边已经自己编译过,所以不需要安装opencv manager,直接走else初始化就好了。
下面将raw下的xml文件读取出来,创建一个分类器,这个分类器后面会对每图片中的人脸进行识别。
然后在onCameraFrame方法中,首先从inputFrame中拿到该帧的rgba图像和灰度图像,灰度图像用来检测输出人脸,最后将人脸在彩色图像中画出来。
主要了解一下mJavaDetector.detectMultiScale这个方法个参数的含义,
1.image表示的是要检测的输入图像
2.objects表示检测到的人脸目标序列
3.scaleFactor表示每次图像尺寸减小的比例
4. minNeighbors表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸),
5.minSize为目标的最小尺寸
6.minSize为目标的最大尺寸
总结
用的都是官方现成的东西做的,可以简单的做一些图片视频中的人脸检测,后面会跟一篇关于怎么训练特定的人脸特征,从而实现识别检测出的人脸。