先上效果图
上面是几张效果图,根据检测到的人脸来识别该人是谁。
首先是开发环境:
AndroidStudio3.0 NDKr12 Gradle4.1 官方的Opencv3.44
1.在官网 https://opencv.org/releases/ 下载Opencv的SDK,本人用的是3.44的版本,因为opencv好像3.0版本开始就会内置OpencvManager,不用在额外安装OpencvManager的APK这么麻烦了。
2.下载NDK开发包,配置Windows下NDK-BUILD的环境,这样就可以在任意目录下进行.so库的编译了。
3.由于本人的Gradle版本是3.4的所以在导入Sample的时候提示Gradle最低版本需要4.1。附上Gradle下载地址 http://services.gradle.org/distributions/ 。
环境差不多就是这样了。
SDK下载后的目录,Demo都在samples中了。
我这里用的就是face-detection了,导入后替换了一下Gradle版本4.1
添加一下NDK支持,差不多就可以跑起来了,识别到人脸后会出现人脸框。
人脸检测差不多是NDK自带的了,下面我们看看人脸识别。
人脸识别对比用的是OpencvLibarary下的
Imgproc.compareHist(srcMat, desMat, Imgproc.CV_COMP_CORREL);
对应的Native函数是 C++: double cv::compareHist(Mat H1, Mat H2, int method)
大概思路就是:将人脸检测回调中的Bitmap和自己准备的Bitmap转换为Mat矩阵后设置同样大小的Size(Size大小不同会出错)然后将矩阵颜色设置为灰色(置灰是为了减小色泽和明暗对识别产生的影响)后就可以开始比对了,对比返回的double值就是识别相似度。
下面是我的对比过程
最后对比获得相似度后就可以通过最大相似度来从众多人脸中得到最匹配的人脸了。
.so库编译时有个需要注意的地方:Android.mk文件中 include的路径要多加一个返回上级目录。
还有,double compareHist(Mat H1, Mat H2, int method)中的 method有4种方式:
1.直方图比较法-相关性计算(CV_COMP_CORREL)
d=1:两幅图完全一致
d越接近1两幅图越相似
默认使用
2.直方图比较法-卡方计算(CV_COMP_CHISQR)
d=0:两幅图完全相同
d越小两幅图越相同
3.直方图比较法-十字计算(CV_COMP_INTERSECT)
不常用,很不准确
4.直方图比较法-巴氏距离计算(CV_COMP_BHATTACHARYYA)
d=0:完全相等
d越接近0两幅图越相似
比较精确
有兴趣的朋友可以都试一试。
人脸识别还有很多需要优化的地方,上了年纪做下记录,希望能帮到大家少走弯路,谢谢大家。
我在刚开始编译官方OpencvSDK的时候发现了许多好的文章推荐一下。
http://johnhany.net/2017/08/moaap-chapter-4-codes/
该博主采用的是AndroidStudio配置CMAKE的编译方式,还有许多有关Opencv的文章写的很详细。