基于OpencvForAndroid3.49的人脸检测教程

概述

做了一个人脸检测的App,整理出来分享一下。这篇人脸检测是基于OpenCV来实现的。OpenCV是一个强大的跨平台计算机视觉库,至于多强大,自行百度。我们这边主要介绍的是OpenCV4Android。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200211122511747.gif

环境配置

1.下载opencv-3.4.9-android-sdk
首先是OpenCV的官网,找到下图中的Android下载即可,这边我们用的是3.4.9,点击下载即可。
基于OpencvForAndroid3.49的人脸检测教程_第1张图片

2.导入工程

新建一个安卓工程后在原有工程中导入opencv-3.4.9-android-sdk\OpenCV-android-sdk\sdk\下的java模块,如下
基于OpencvForAndroid3.49的人脸检测教程_第2张图片基于OpencvForAndroid3.49的人脸检测教程_第3张图片
点击Next,Finsh完成模块导入。

3.修改gradle,导入依赖

修改opencv模块的gradle,跟项目的配置保持一致。
基于OpencvForAndroid3.49的人脸检测教程_第4张图片
在项目中导入opencv依赖,如下:
基于OpencvForAndroid3.49的人脸检测教程_第5张图片
基于OpencvForAndroid3.49的人脸检测教程_第6张图片
点击OK,等待编译即可。

到这边为止,OpenCV的基本环境就导入完毕了,下面就可以正常使用opencv了。

人脸检测模块的移植

这边我们只涉及人脸检测模块的移植,不涉及原理。在刚才下载的opencv-3.4.9-android-sdk\OpenCV-android-sdk\samples目录下有很多官方demo,其中有一个face-detection,这就是官方给的人脸识别demo,我们要做的就是把他的核心功能移植到自己的App中。
###1.复制face-detection中的模块
复制face-detection中的jni到自己工程的目录下如图
基于OpencvForAndroid3.49的人脸检测教程_第7张图片

2.修改android.mk文件

基于OpencvForAndroid3.49的人脸检测教程_第8张图片
其中F:\asprojects\AI\OpenCV\opencv-3.4.9-android-sdk\OpenCV-android-sdk\sdk\native\jni\OpenCV.mk为我本地opencv-3.4.9-android-sdk下的OpenCV.mk路径,这边需要替换成大家自己的本地路径。

3.修改Application.mk文件
基于OpencvForAndroid3.49的人脸检测教程_第9张图片
APP_ABI根据自己需求添加,也可以参照我这边的四个架构;Platform我这选择的是21.

3.修改DetectionBasedTracker_jni.cpp和DetectionBasedTracker_jni.h文件

基于OpencvForAndroid3.49的人脸检测教程_第10张图片
选择文件中的org_oepncv_samples_facedetect,ctrl+r替换成自己的包名,两个文件所有的org_oepncv_samples_facedetect都替换(一定要全部替换)。

4.编译文件生成so库

完成以上操作后,在terminal中进入jni目录下,手敲ndk-build即可完成编译(项目的ndk)
基于OpencvForAndroid3.49的人脸检测教程_第11张图片
完成编译后就会出现libs文件夹,里面就有我们需要的库了。

5.移植samples中代码

从facedetect中将java文件和布局文件拷到自己的工程中来即可,lbpcascade_frontalface.xml是人脸特征库,直接用就好了,想了解的百度一下Haar、LBP特征。
基于OpencvForAndroid3.49的人脸检测教程_第12张图片
运行起来就可以实现实时的人脸识别了。

效果展示

这边只局限于正脸(因为只用了正脸的特征,侧脸的自行更改特征文件),效果还行吧,没有对图片做任何处理,明暗程度对人脸检测的影响还是很大的。

代码简析

简单讲一下代码,首先是opencvlibrary的初始化,如果没有做上面的so包编译,就需要额外安装一个opencv manager的app(具体没试过);因为我们这边已经自己编译过,所以不需要安装opencv manager,直接走else初始化就好了。
基于OpencvForAndroid3.49的人脸检测教程_第13张图片
下面将raw下的xml文件读取出来,创建一个分类器,这个分类器后面会对每图片中的人脸进行识别。
基于OpencvForAndroid3.49的人脸检测教程_第14张图片
然后在onCameraFrame方法中,首先从inputFrame中拿到该帧的rgba图像和灰度图像,灰度图像用来检测输出人脸,最后将人脸在彩色图像中画出来。
主要了解一下mJavaDetector.detectMultiScale这个方法个参数的含义,
1.image表示的是要检测的输入图像
2.objects表示检测到的人脸目标序列
3.scaleFactor表示每次图像尺寸减小的比例
4. minNeighbors表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸),
5.minSize为目标的最小尺寸
6.minSize为目标的最大尺寸
基于OpencvForAndroid3.49的人脸检测教程_第15张图片

总结

用的都是官方现成的东西做的,可以简单的做一些图片视频中的人脸检测,后面会跟一篇关于怎么训练特定的人脸特征,从而实现识别检测出的人脸。

你可能感兴趣的:(AI,android)