Android使用 Opencv3.4.4+NDK实现人脸检测和人脸识别(免安装OpencvManager)

先上效果图

上面是几张效果图,根据检测到的人脸来识别该人是谁。

首先是开发环境:

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的文章写的很详细。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值