前言:
之前有個項目需要帶人臉檢測,檢測完成後需要上傳服務器進行人臉識別。目前有很多方案可以用,很多是第三方的,比如虹軟、百度。但是缺點就是,商用收費,而且不支持離線,需要聯網驗證。再者,我們只需要人臉檢測這麼簡單的功能就是了,不需要搞那麼複雜。後面找到這個文章,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" />