代碼 演示效果:

一,創建賬號,并集成百度人臉離線采集
1、注冊百度賬號并認證
百度智能云地址:百度智能云控制臺-管理中心 (baidu.com)
登錄百度智能云后選擇人臉采集

2. 創建你的應用

3.創建完成后,選擇本地化部署,選擇 離線人臉采集sdk 
4. 需要注冊,按照流程走就行,一般一天就能申請下來

5. 注冊完成后 創建新的授權

授權標識: 就是License ID 可以隨意填寫
場景型別:根據需要填寫
開發平臺:選擇Android即可
Android包名 : 一定要和你的專案包名一樣 比如我的專案包名是 com.bd.face,
那么我填寫的也是com.bd.face
android MD5 簽名:
1.首先 你要在Android中創建一個簽名:




密鑰 Alias:為您的密鑰輸入一個標識名,
Password:為您的密鑰創建并確認一個安全的密碼,此密碼應當與您為密鑰庫選擇 的密碼不同
Validity (years):以年為單位設定密鑰的有效時長,密鑰的有效期應至少為 25 年, 以便您可以在應用的整個生命期內使用相同的密鑰簽署應用更新,
Certificate:為證書輸入一些關于您自己的資訊,此資訊不會顯示在應用中,但會作 為 APK 的一部分包含在您的證書中, 填寫完表單后,請點擊 OK
這樣你的簽名就已經生成好了 請牢記你的密碼
2. (此步驟不可省略)生成完成之后 下面我們對 專案進行加簽

輸入上面Alias密鑰標識 選擇檔案位置,輸入你剛注冊的密碼 這里release 和debug 都需要

3. 下面開始生成簽名的MD5
找到 studio中的Terminal

4.輸入命令“ keytool -v -list -keystore gradledemo.jks ” 回車,(這里的xxxx.jks要輸入你自己的),然后輸入密碼,就獲取到你想要的資訊了,如圖

5.把得到的MD5 值 輸入到 這里

點擊確定后 生成


下面開始集成:
二、集成
2.1 創建 assets 資源檔案夾 放入下載的 License

2.2 引入faceplatform-release庫
將開發包中的faceplatform-release庫 Import Module 到工程,
2.3 引入faceplatform-ui庫
將開發包中的faceplatform-ui庫 Import Module 到工程,
2.4 在 app 下的build.gradle 中添加
implementation project(path: ':faceplatform-ui')
以上集成就已經完全集成成功!
下面奉上代碼程序:
二.代碼實作:
2.1首先添加權限:
清單檔案中需要添加一下檔案
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
<uses-permission android:name="android.permission.READ_CALENDAR"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.hardware.camera.autofocus"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
需要添加動態權限有:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
,Manifest.permission.CAMERA
},1001);
}
2.2初始化FaceSDKManager
2.2.1 首先配置 人臉引數資料 上代碼:
代碼有點多但是基本上都是復制
private void setFaceConfig() {
// 獲取配置人臉 的介面
FaceConfig config = FaceSDKManager.getInstance().getFaceConfig();
// 設定模糊度閾值
config.setBlurnessValue((float)0.8);
// 設定最小光照閾值(范圍0-255)
config.setBrightnessValue(30);
// 設定最大光照閾值(范圍0-255)
config.setBrightnessMaxValue(240);
// 設定左眼遮擋閾值
config.setOcclusionLeftEyeValue(v);
// 設定右眼遮擋閾值
config.setOcclusionRightEyeValue(v);
// 設定鼻子遮擋閾值
config.setOcclusionNoseValue(v);
// 設定嘴巴遮擋閾值
config.setOcclusionMouthValue(v);
// 設定左臉頰遮擋閾值
config.setOcclusionLeftContourValue(v);
// 設定右臉頰遮擋閾值
config.setOcclusionRightContourValue(v);
// 設定下巴遮擋閾值
config.setOcclusionChinValue(v);
// 設定人臉姿態角閾值
config.setHeadPitchValue(30);
config.setHeadYawValue(18);
config.setHeadRollValue(30);
// 設定可檢測的最小人臉閾值
config.setMinFaceSize(FaceEnvironment.VALUE_MIN_FACE_SIZE);
// 設定可檢測到人臉的閾值
config.setNotFaceValue(FaceEnvironment.VALUE_NOT_FACE_THRESHOLD);
// 設定閉眼閾值
config.setEyeClosedValue(FaceEnvironment.VALUE_CLOSE_EYES);
// 設定圖片快取數量
config.setCacheImageNum(FaceEnvironment.VALUE_CACHE_IMAGE_NUM);
// 設定活體動作,通過設定list,LivenessTypeEunm.Eye, LivenessTypeEunm.Mouth,
// LivenessTypeEunm.HeadUp, LivenessTypeEunm.HeadDown, LivenessTypeEunm.HeadLeft,
// LivenessTypeEunm.HeadRight
config.setLivenessTypeList(livenessList);
// 設定動作活體是否隨機
config.setLivenessRandom(true);
// 設定開啟提示音
config.setSound(true);
// 原圖縮放系數
config.setScale(FaceEnvironment.VALUE_SCALE);
// 摳圖寬高的設定,為了保證好的摳圖效果,建議高寬比是4:3
config.setCropHeight(FaceEnvironment.VALUE_CROP_HEIGHT);
config.setCropWidth(FaceEnvironment.VALUE_CROP_WIDTH);
// 摳圖人臉框與背景比例
config.setEnlargeRatio(FaceEnvironment.VALUE_CROP_ENLARGERATIO);
// 加密型別,0:Base64加密,上傳時image_sec傳false;1:百度加密檔案加密,上傳時image_sec傳true
config.setSecType(FaceEnvironment.VALUE_SEC_TYPE);
// 檢測超時設定
config.setTimeDetectModule(FaceEnvironment.TIME_DETECT_MODULE);
// 檢測框遠近比率
config.setFaceFarRatio(FaceEnvironment.VALUE_FAR_RATIO);
config.setFaceClosedRatio(FaceEnvironment.VALUE_CLOSED_RATIO);
// 保存 設定
FaceSDKManager.getInstance().setFaceConfig(config);
}
2.2.2初始化FaceSDKManager
// 初始化 人臉 功能
private void initLicense() {
// 呼叫 配置資訊方法
setFaceConfig();
// 為了android和ios 區分授權,appId=appname_face_android ,其中appname為申請sdk時的應用名
// 應用背景關系
// 申請License取得的APPID
// assets目錄下License檔案名
FaceSDKManager.getInstance().initialize(this, "******-face-android",
"idl-license.face-android", new IInitCallback() {
@Override
public void initSuccess() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "初始化成功", Toast.LENGTH_SHORT).show();
isfacle=true;
}
});
}
@Override
public void initFailure(final int errCode, final String errMsg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "初始化失敗", Toast.LENGTH_SHORT).show();
isfacle=false;
}
});
}
});
}
這樣咱們 的初始化就完成了 下面就是初始化的全部代碼
布局代碼:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:onClick="onclick"
android:text="人臉采集"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
Java代碼
import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import com.baidu.idl.face.platform.FaceConfig;
import com.baidu.idl.face.platform.FaceEnvironment;
import com.baidu.idl.face.platform.FaceSDKManager;
import com.baidu.idl.face.platform.LivenessTypeEnum;
import com.baidu.idl.face.platform.listener.IInitCallback;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private List<LivenessTypeEnum> livenessList;
private float v = (float)0.95;
private boolean isfacle=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CAMERA},1001);
}
// 動作活體條目集合
livenessList = new ArrayList<>();
// 眨眼
livenessList.add(LivenessTypeEnum.Eye);
// 張嘴
livenessList.add(LivenessTypeEnum.Mouth);
// 右轉
livenessList.add(LivenessTypeEnum.HeadRight);
// 初始化FaceSDK
initLicense();
}
public void onclick(View view) {
if (isfacle){
// 跳轉到采集頁面
startActivity(new Intent(this,FaceLivenessExpActivity.class));
}else {
Toast.makeText(this, "初始化失敗", Toast.LENGTH_SHORT).show();
}
}
/**
* 引數配置方法
*/
private void setFaceConfig() {
// 獲取配置人臉 的介面
FaceConfig config = FaceSDKManager.getInstance().getFaceConfig();
// 設定模糊度閾值
config.setBlurnessValue((float)0.8);
// 設定最小光照閾值(范圍0-255)
config.setBrightnessValue(30);
// 設定最大光照閾值(范圍0-255)
config.setBrightnessMaxValue(240);
// 設定左眼遮擋閾值
config.setOcclusionLeftEyeValue(v);
// 設定右眼遮擋閾值
config.setOcclusionRightEyeValue(v);
// 設定鼻子遮擋閾值
config.setOcclusionNoseValue(v);
// 設定嘴巴遮擋閾值
config.setOcclusionMouthValue(v);
// 設定左臉頰遮擋閾值
config.setOcclusionLeftContourValue(v);
// 設定右臉頰遮擋閾值
config.setOcclusionRightContourValue(v);
// 設定下巴遮擋閾值
config.setOcclusionChinValue(v);
// 設定人臉姿態角閾值
config.setHeadPitchValue(30);
config.setHeadYawValue(18);
config.setHeadRollValue(30);
// 設定可檢測的最小人臉閾值
config.setMinFaceSize(FaceEnvironment.VALUE_MIN_FACE_SIZE);
// 設定可檢測到人臉的閾值
config.setNotFaceValue(FaceEnvironment.VALUE_NOT_FACE_THRESHOLD);
// 設定閉眼閾值
config.setEyeClosedValue(FaceEnvironment.VALUE_CLOSE_EYES);
// 設定圖片快取數量
config.setCacheImageNum(FaceEnvironment.VALUE_CACHE_IMAGE_NUM);
// 設定活體動作,通過設定list,LivenessTypeEunm.Eye, LivenessTypeEunm.Mouth,
// LivenessTypeEunm.HeadUp, LivenessTypeEunm.HeadDown, LivenessTypeEunm.HeadLeft,
// LivenessTypeEunm.HeadRight
config.setLivenessTypeList(livenessList);
// 設定動作活體是否隨機
config.setLivenessRandom(true);
// 設定開啟提示音
config.setSound(true);
// 原圖縮放系數
config.setScale(FaceEnvironment.VALUE_SCALE);
// 摳圖寬高的設定,為了保證好的摳圖效果,建議高寬比是4:3
config.setCropHeight(FaceEnvironment.VALUE_CROP_HEIGHT);
config.setCropWidth(FaceEnvironment.VALUE_CROP_WIDTH);
// 摳圖人臉框與背景比例
config.setEnlargeRatio(FaceEnvironment.VALUE_CROP_ENLARGERATIO);
// 加密型別,0:Base64加密,上傳時image_sec傳false;1:百度加密檔案加密,上傳時image_sec傳true
config.setSecType(FaceEnvironment.VALUE_SEC_TYPE);
// 檢測超時設定
config.setTimeDetectModule(FaceEnvironment.TIME_DETECT_MODULE);
// 檢測框遠近比率
config.setFaceFarRatio(FaceEnvironment.VALUE_FAR_RATIO);
config.setFaceClosedRatio(FaceEnvironment.VALUE_CLOSED_RATIO);
// 保存 設定
FaceSDKManager.getInstance().setFaceConfig(config);
}
// 初始化 人臉 功能
private void initLicense() {
// 呼叫 配置資訊方法
setFaceConfig();
// 為了android和ios 區分授權,appId=appname_face_android ,其中appname為申請sdk時的應用名
// 應用背景關系
// 申請License取得的APPID
// assets目錄下License檔案名
FaceSDKManager.getInstance().initialize(this, "wangyilong-face-android",
"idl-license.face-android", new IInitCallback() {
@Override
public void initSuccess() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "初始化成功", Toast.LENGTH_SHORT).show();
isfacle=true;
}
});
}
@Override
public void initFailure(final int errCode, final String errMsg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "初始化失敗", Toast.LENGTH_SHORT).show();
isfacle=false;
}
});
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
// 釋放資源
FaceSDKManager.getInstance().release();
}
}
2.2 采集人臉頁面的代碼
2.2.1 創建一個java類 集成自 FaceLivenessActivity 這個 FaceLivenessActivity 是參考的Module里面的 在清單檔案中記得注冊
<activity
android:name=".FaceLivenessExpActivity"
android:hardwareAccelerated="true"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
Java代碼: 重寫里面的 onLivenessCompletion 方法
// todo 人臉 識別 活體檢測
public class FaceLivenessExpActivity extends FaceLivenessActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
// 開始采集
@Override
public void onLivenessCompletion(FaceStatusNewEnum status, String message,
HashMap<String, ImageInfo> base64ImageCropMap,
HashMap<String, ImageInfo> base64ImageSrcMap, int currentLivenessCount) {
super.onLivenessCompletion(status, message, base64ImageCropMap, base64ImageSrcMap, currentLivenessCount);
}
@Override
public void finish() {
super.finish();
}
}
獲取最優圖片 人臉采集時像素最清晰的一張
// 開始采集
@Override
public void onLivenessCompletion(FaceStatusNewEnum status, String message,
HashMap<String, ImageInfo> base64ImageCropMap,
HashMap<String, ImageInfo> base64ImageSrcMap, int currentLivenessCount) {
super.onLivenessCompletion(status, message, base64ImageCropMap, base64ImageSrcMap, currentLivenessCount);
if (status == FaceStatusNewEnum.OK && mIsCompletion) {
// 獲取最優圖片
/***
* base64ImageCropMap 裁剪 圖片 集合
* base64ImageSrcMap 原圖集合
* */
getBestImage(base64ImageCropMap, base64ImageSrcMap);
// 在規定時間內沒有完成
} else if (status == FaceStatusNewEnum.DetectRemindCodeTimeout) {
// 提示 影片
if (mViewBg != null) {
mViewBg.setVisibility(View.VISIBLE);
}
Toast.makeText(this, "您在規定時間內尚未完成", Toast.LENGTH_SHORT).show();
}
}
/**
* 獲取最優圖片
* @param imageCropMap 摳圖集合
* @param imageSrcMap 原圖集合
*/
private void getBestImage(HashMap<String, ImageInfo> imageCropMap,
HashMap<String, ImageInfo> imageSrcMap) {
String bmpStr = null;
// 將摳圖集合中的圖片按照質量降序排序,最終選取質量最優的一張摳圖圖片
if (imageCropMap != null && imageCropMap.size() > 0) {
List<Map.Entry<String, ImageInfo>> list1 = new ArrayList<>(imageCropMap.entrySet());
// 回傳來的 值 在list1 中
Collections.sort(list1, new Comparator<Map.Entry<String, ImageInfo>>() {
@Override
public int compare(Map.Entry<String, ImageInfo> o1,
Map.Entry<String, ImageInfo> o2) {
String[] key1 = o1.getKey().split("_");
String score1 = key1[2];
String[] key2 = o2.getKey().split("_");
String score2 = key2[2];
// return 用于 結束回圈 并回傳 排完的集合
// 降序排序
return Float.valueOf(score2).compareTo(Float.valueOf(score1));
}
});
// 獲取摳圖中的加密或非加密的base64
// int secType = mFaceConfig.getSecType();
// String base64;
// if (secType == 0) {
// base64 = list1.get(0).getValue().getBase64();
// } else {
// base64 = list1.get(0).getValue().getSecBase64();
// }
}
// 將原圖集合中的圖片按照質量降序排序,最終選取質量最優的一張原圖圖片
if (imageSrcMap != null && imageSrcMap.size() > 0) {
List<Map.Entry<String, ImageInfo>> list2 = new ArrayList<>(imageSrcMap.entrySet());
// 排序方法 回傳的值在list2中
Collections.sort(list2, new Comparator<Map.Entry<String, ImageInfo>>() {
@Override
public int compare(Map.Entry<String, ImageInfo> o1,
Map.Entry<String, ImageInfo> o2) {
String[] key1 = o1.getKey().split("_");
String score1 = key1[2];
String[] key2 = o2.getKey().split("_");
String score2 = key2[2];
// 降序排序
return Float.valueOf(score2).compareTo(Float.valueOf(score1));
}
});
// 獲取 原圖 集合中最優的一張圖片
// 給他轉化為 Base64 碼
// 這個碼 就是我們人臉的資訊
bmpStr = list2.get(0).getValue().getBase64();
// 獲取原圖中的加密或非加密的base64
// int secType = mFaceConfig.getSecType();
// String base64;
// if (secType == 0) {
// base64 = bmpStr;
// } else {
// base64 = list2.get(0).getValue().getBase64();
// }
// Log.i("base64", base64);
}
// 獲取完 人臉資訊后 頁面跳轉
// IntentUtils 匯入的包 封裝好的
IntentUtils.getInstance().setBitmap(bmpStr);
Intent intent = new Intent(FaceLivenessExpActivity.this,
CompleteActivity.class);
startActivity(intent);
}
還有一個 采集完成跳轉的Activity 在下面給大家貼上代碼
public class CompleteActivity extends AppCompatActivity {
private ImageView image;
private String bmpStr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_complete);
image = findViewById(R.id.image);
Intent intent = getIntent();
if (intent != null) {
// 把 傳過來的 Bitmp 流轉化為 bitmmap 圖片
bmpStr = IntentUtils.getInstance().getBitmap();
if (TextUtils.isEmpty(bmpStr)) {
return;
}
Bitmap bmp = base64ToBitmap(bmpStr);
// 進行裁剪
bmp = FaceSDKManager.getInstance().scaleImage(bmp,
DensityUtils.dip2px(getApplicationContext(), 97),
DensityUtils.dip2px(getApplicationContext(), 97));
image.setImageBitmap(bmp);
Log.i("base64", "initData: "+ bmpStr);
}
}
private Bitmap base64ToBitmap(String base64Data) {
byte[] bytes = Base64Utils.decode(base64Data, Base64Utils.NO_WRAP);
return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 釋放資源
IntentUtils.getInstance().release();
}
以上又是人臉識別的全部程序 第一次寫博客 多謝大家支持! 在集成程序中如果有疑問
到人臉識別_人臉檢測_人臉對比_人臉搜索_活體檢測_百度智能云 (baidu.com) 官方檔案 解決
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/398714.html
標籤:其他
