Android 人脸识别实践
前言
最近写了写设计模式相关的内容,感觉写的好烂,还不如多写点实践的东西,把我练手的项目设计好的一些模块补充完,最近就从Android硬件部分开始补充吧。
前面把相机写好了,正好想试试人脸识别,而Android也默认提供了人脸识别的功能,就试试吧!
效果图
读者可以先看看效果,再往下看代码实现:
不好意思,放错了,正确的是下面这个:
Android这人脸识别也是逗,鸡哥表情包居然还confidence有0.5几。。。
人脸识别库选择
查找了一些文章,实际上人脸识别有很多库可以选择,下面就简单介绍下:
- Camera1 API的FaceDetectionListener,但是Camera1过时了
- Android SDK提供的FaceDetector
- Google Play Services Vision API,但是需要手机有Google服务框架
- OpenCV,开源计算机视觉库
- 第三方库: Face++ Android SDK、Microsoft Face API、百度人脸识别SDK。。。
本着简单方便的期望,又不想导入第三方库,我还是选择了FaceDetector来实现人脸识别。
下面就用CameraX和FaceDetector来实践下吧。
CameraX配置图像分析
关于相机的使用可以参考我前面的文章:
这里就用最简单的CameraX来做人脸识别,比较简单,和拍照相比,就是把ImageCapture换成了ImageAnalysis,下面简单看代码:
1 | kotlin复制代码/** |
就是在bindToLifecycle的时候传入一个imageAnalysis,imageAnalysis里面设置好我们对图像逐帧处理的FaceAnalyzer。
FaceDetector人脸识别
当CameraX预览进行的同时,FaceAnalyzer就会逐帧识别,调用它的analyze方法来识别人脸,下面看代码:
1 | kotlin复制代码@SuppressLint("UnsafeOptInUsageError") |
FaceDetector的使用很简单,创建好后,调用它的findFaces方法就可以识别人脸了。
这里需要注意的一点就是,CameraX默认得到的图片格式是yuv格式的,需要做下转换,FaceDetector只支持Bitmap.Config.RGB_565格式:
1 | kotlin复制代码private fun imageProxyToBitmap(image: Image, rotationDegrees: Int): Bitmap { |
将yuv格式转成rgb_565格式,就能识别了。
使用
我们只要在页面加载完成的时候启动预览,传入一个callback就能拿到识别到的bitmap了:
1 | kotlin复制代码binding.root.post { |
我这里加了个isOpenDetector来控制识别,识别到了人脸,就不用一直处理bitmap了,很耗资源。
源码及Demo
源码和demo都放在我练手的仓库里面,有兴趣可以参考下:
小结
花了点时间,通过CameraX和FaceDetector实现了一个动态的人脸识别功能,比较简单,仅仅是人脸识别,并不能认证哈。
本文转载自: 掘金