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

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