Android 用虹软SDK做人脸识别
人臉識別第三方sdk比較多,但是大多都是收費的或者限制次數什么的,虹軟的效果還不錯,全免費也不需要聯網
V1.2版本使用和快速集成:https://www.jianshu.com/p/8dee89ec4a24(Android集成虹軟人臉、人證對比,活體檢測)
虹軟官網https://ai.arcsoft.com.cn/
官網下載sdk,還要引入一個依賴,用來轉換把bitmap以一定的格式轉為byte[]的
api 'com.guo.android_extend:android-extend:1.0.1'
官網的demo里面其實就寫的比較清楚了,總共分為兩個部分,一個是人臉注冊,一個是人臉識別,先提取人臉特征,再和之前提取的比較得出相似度,可以根據相似度來判斷是不是一個人
人臉注冊
就是提取人臉的特征,一張圖片可以識別出多個人臉特征(如果有多個人臉),特征是一個byte數組,其實不用圖片,獲取相機的預覽回調獲取圖片數據這種方法也是很好的,反正傳入圖片數據就可以,分為以下幾步:
初始化要提取人臉識別的圖片數據
首先獲取了一個AFD_FSDKFace的集合,用來保存傳入引擎檢測的人臉信息,其中包括了人臉的角度和一個Rect對象,Rect對象就是人臉在圖片中的位置,可以根據這個Rect來把人臉部分標記出來什么的
//初始化 AFD_FSDKEngine engine = new AFD_FSDKEngine(); AFD_FSDKVersion version = new AFD_FSDKVersion(); List<AFD_FSDKFace> result = new ArrayList<AFD_FSDKFace>(); //設置最多識別5張人臉 AFD_FSDKError err = engine.AFD_FSDK_InitialFaceEngine(FaceDB.appid, FaceDB.fd_key, AFD_FSDKEngine.AFD_OPF_0_HIGHER_EXT, 16, 5);//獲取人臉信息 result err = engine.AFD_FSDK_GetVersion(version); err = engine.AFD_FSDK_StillImageFaceDetection(data, mBitmap.getWidth(), mBitmap.getHeight(), AFD_FSDKEngine.CP_PAF_NV21, result);
根據獲取到的AFD_FSDKFace集合和原圖像獲取人臉的特征,每個AFD_FSDKFace都可以獲取到一個AFR_FSDKFace對象,包括就是一個byte[]類型的變量mFeatureData用來保存人臉特征,和一個引擎定義的特征信息數據長度int類型的變量FEATURE_SIZE(不用管這個)
//初始化 AFR_FSDKVersion version1 = new AFR_FSDKVersion(); AFR_FSDKEngine engine1 = new AFR_FSDKEngine(); AFR_FSDKFace result1 = new AFR_FSDKFace(); AFR_FSDKError error1 = engine1.AFR_FSDK_InitialEngine(FaceDB.appid, FaceDB.fr_key); error1 = engine1.AFR_FSDK_GetVersion(version1);//獲取人臉特征 mAFR_FSDKFace error1 = engine1.AFR_FSDK_ExtractFRFeature(data, mBitmap.getWidth(), mBitmap.getHeight(), AFR_FSDKEngine.CP_PAF_NV21, new Rect(result.get(0).getRect()), result.get(0).getDegree(), result1);if(error1.getCode() == error1.MOK) { mAFR_FSDKFace = result1.clone(); }//銷毀引擎,釋放內存資源 engine1.AFR_FSDK_UninitialEngine(); engine.AFD_FSDK_UninitialFaceEngine();
其實mAFR_FSDKFace里面的byte[]類型的變量mFeatureData就是需要的人臉特征,自己隨便保存一下,人臉識別的時候再拿出來對比
人臉識別
人臉識別方式就是再獲取到人臉的特征和之前保存的人臉特征對比,獲取的方式有很多,除了上面的圖片來獲取以外還可以通過調用相機的預覽回調來獲取數據來獲取人臉的特征再去對比,這樣體驗比較好和現在手機常用的人臉識別方法一樣,自定義相機就不寫出來了,步驟如下:
//需要設置相機預覽圖片的格式 para.setPreviewFormat(ImageFormat.NV21);
//相機預覽回調獲取數據 byte[] faceData; private Camera.PreviewCallback mPreViewCallback = new Camera.PreviewCallback() { @Override public void onPreviewFrame(final byte[] data, Camera camera) { if (startFaceCheck) { err = engine.AFT_FSDK_FaceFeatureDetect(data, mWidthPicture, mHeightPreview, AFT_FSDKEngine.CP_PAF_NV21, resultAtf); faceData = data.clone(); } } };
獲取到數據后獲取人臉特征然后開始對比,方法就是這樣,邏輯可以自己設計,也可以根據獲取到的人臉數據AFD_FSDKFace來實時的畫出人臉的位置
//獲取到人臉的信息 resultAtf.clear(); startFaceCheck = true; error2 = engine2.AFR_FSDK_ExtractFRFeature(faceData, mWidthPicture, mHeightPreview, AFR_FSDKEngine.CP_PAF_NV21, resultAtf.get(resultAtf.size() - 1).getRect(), resultAtf.get(resultAtf.size() - 1).getDegree(), result);//初始化對比 AFR_FSDKMatching score = new AFR_FSDKMatching(); AFR_FSDKFace input = new AFR_FSDKFace();//這是獲取我保存的人臉數據,就是有個名字加一個人臉特征 List<FaceDiscern> faceDiscernList = MLiteOrm.getInstance().query(FaceDiscern.class);for (int i = 0; i < faceDiscernList.size(); i++) { final String name = faceDiscernList.get(i).getUserName(); input.setFeatureData(faceDiscernList.get(i).getFaceId()); error2 = engine2.AFR_FSDK_FacePairMatching(result, input, score); //獲取相似度 float max = 0.0f; max = score.getScore(); if (max > 0.6) { ToastUtils.showLong("驗證通過,操作人:" + name); } }//銷毀引擎,釋放內存資源 engine2.AFR_FSDK_UninitialEngine(); engine.AFT_FSDK_UninitialFaceEngine();
轉載于:https://www.cnblogs.com/Zzz-/p/10559398.html
總結
以上是生活随笔為你收集整理的Android 用虹软SDK做人脸识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 巨蟒django之CRM5 学习记录课程
- 下一篇: Docker 在容器中部署静态网站