Android最简单完美的人脸检测实现方式

前言:
之前有个项目需要带人脸检测,检测完成后需要上传服务器进行人脸识别。目前有很多方案可以用,很多是第三方的,比如虹软、百度。但是缺点就是,商用收费,而且不支持离线,需要联网验证。再者,我们只需要人脸检测这么简单的功能就是了,不需要搞那么复杂。后面找到这个文章,https://blog.csdn.net/janecer/article/details/79092212,按照上面的,也实现起来了,项目中也用起来,但是也有其中的缺点:不够灵活,代码啰嗦,摄像头初始化慢,人脸检测流畅度差强人意,只能说能用。后面接触了些收费的人脸识别sdk,参考了它们的一些方案,于是做了这个人脸检测的,应该能满足这种需求了。

需求定位: 集成简单、代码灵活、只需要人脸检测功能、流畅性好、不需要激活,免费

实现功能

  • 摄像头预览同时检测人脸,并绘制人脸框
  • 能获取到检测到人脸图片,方便进行下一步业务操作
  • 使用TextureView预览摄像头,支持异步检测,画面流畅性好
  • 灵活封装,检测时间与频率参数支持动态设置,满足不同设备的需求
  • 支持无人脸时智能进入休眠检测机制

demo效果图

转载请注明来源:https://blog.csdn.net/u014614038/article/details/103294643
在这里插入图片描述

实现原理

在这里插入图片描述
如上图所示,FaceDetectView包括了两个view:TextureView、FaceBorderView。

  • TextureView:用于预览摄像头,同时获取摄像头预览的每一帧画面
  • FaceBorderView用于绘制人脸边框

整个工作流程总结就是:
预览摄像头过程中,对每一帧摄像头画面进行异步人脸检测,检测到人脸后,进行绘制人脸边框。

代码集成与使用

  • 引入FaceDetector
allprojects {
    repositories {
    ...
        maven { url 'https://jitpack.io' }
    }
}

 implementation 'com.github.bifan-wei:FaceDetector:V1.0'

  • 引入FaceDetectView
 <com.bifan.detectlib.FaceDetectView
       android:id="@+id/faceDetectView"
       android:layout_width="800px"
       android:layout_height="800px"
       android:layout_centerInParent="true"
       android:background="#000000" />
  • 添加画面监听,用于项目中的业务处理
 faceDetectView = findViewById(R.id.faceDetectView);
        faceDetectView.setFramePreViewListener(new FaceDetectTextureView.IFramePreViewListener() {
            @Override
            public boolean onFrame(Bitmap preFrame) {
                //每一帧回调
                //这个这帧preFrame处理了就是进行了回收,返回true
                //否则返回false,内部进行回收处理
                return false;
            }

            @Override
            public boolean onFaceFrame(Bitmap preFrame, FaceDetector.Face[] faces) {
                //faces是检测出来的人脸参数
                //检测到人脸的回调,保存人脸图片到本地
                if (isSavingPic == false) {
                    isSavingPic = true;
                    executorService.submit(new SavePicRunnable(preFrame));
                }
                Log.i(tag, "当前图片人脸个数:" + faces.length);
                //这个这帧preFrame处理了就是进行了回收,返回true
                //否则返回false,内部进行回收处理
                return true;
            }
        });
  • 启动检测,开始前进行初始化参数
public void startDetect(View view) {
        if (!faceDetectView.isHasInit()) {
            //必须是在view可见后进行初始化
            faceDetectView.initView();
            faceDetectView.initCamera();
            faceDetectView.getDetectConfig().CameraType = Camera.CameraInfo.CAMERA_FACING_FRONT;
            faceDetectView.getDetectConfig().EnableFaceDetect = true;
            faceDetectView.getDetectConfig().MinDetectTime = 100;
            faceDetectView.getDetectConfig().Simple = 0.2f;//图片检测时的压缩取样率,0~1,越小检测越流畅
            faceDetectView.getDetectConfig().MaxDetectTime =2000;//进入智能休眠检测,以2秒一次的这个速度检测
            faceDetectView.getDetectConfig().EnableIdleSleepOption=true;//启用智能休眠检测机制
            faceDetectView.getDetectConfig().IdleSleepOptionJudgeTime=1000*10;//1分钟内没有检测到人脸,进入智能休眠检测
        }
        faceDetectView.startCameraPreview();
    }
  • 停止检测
 public void endDetect(View view) {
        faceDetectView.stopCameraPreview();
        faceDetectView.getFaceRectView().clearBorder();
    }
  • 注意的问题
    1.必须有摄像头权限:
 <uses-permission android:name="android.permission.CAMERA" />

代码下载与apk演示

代码下载
演示apk

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章