用虹軟Android SDK做人臉識別

wallhaven-703709.jpg

人臉識別第三方sdk比較多,但是大多都是收費的或者限制次數(shù)什么的,虹軟的效果還不錯逼蒙,全免費也不需要聯(lián)網(wǎng)

V1.2版本使用和快速集成:Android集成虹軟人臉、人證對比秘蛇,活體檢測

虹軟官網(wǎng):http://www.arcsoft.com.cn/

官網(wǎng)下載sdk其做,還要引入一個依賴,用來轉換把bitmap以一定的格式轉為byte[]的

api 'com.guo.android_extend:android-extend:1.0.1'

官網(wǎng)的demo里面其實就寫的比較清楚了赁还,總共分為兩個部分妖泄,一個是人臉注冊,一個是人臉識別艘策,先提取人臉特征蹈胡,再和之前提取的比較得出相似度,可以根據(jù)相似度來判斷是不是一個人

人臉注冊

就是提取人臉的特征朋蔫,一張圖片可以識別出多個人臉特征(如果有多個人臉)罚渐,特征是一個byte數(shù)組,其實不用圖片驯妄,獲取相機的預覽回調獲取圖片數(shù)據(jù)這種方法也是很好的荷并,反正傳入圖片數(shù)據(jù)就可以,分為以下幾步:

初始化要提取人臉識別的圖片數(shù)據(jù)

//初始化圖片數(shù)據(jù)
byte[] data = new byte[mBitmap.getWidth() * mBitmap.getHeight() * 3 / 2];
ImageConverter convert = new ImageConverter();
convert.initial(mBitmap.getWidth(), mBitmap.getHeight(), ImageConverter.CP_PAF_NV21);
if (convert.convert(mBitmap, data)) {
    Log.d(TAG, "convert ok!");
}
convert.destroy();

首先獲取了一個AFD_FSDKFace的集合青扔,用來保存?zhèn)魅胍鏅z測的人臉信息源织,其中包括了人臉的角度和一個Rect對象翩伪,Rect對象就是人臉在圖片中的位置,可以根據(jù)這個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);

根據(jù)獲取到的AFD_FSDKFace集合和原圖像獲取人臉的特征谈息,每個AFD_FSDKFace都可以獲取到一個AFR_FSDKFace對象缘屹,包括就是一個byte[]類型的變量mFeatureData用來保存人臉特征,和一個引擎定義的特征信息數(shù)據(jù)長度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就是需要的人臉特征轻姿,自己隨便保存一下,人臉識別的時候再拿出來對比

人臉識別

人臉識別方式就是再獲取到人臉的特征和之前保存的人臉特征對比逻炊,獲取的方式有很多互亮,除了上面的圖片來獲取以外還可以通過調用相機的預覽回調來獲取數(shù)據(jù)來獲取人臉的特征再去對比,這樣體驗比較好和現(xiàn)在手機常用的人臉識別方法一樣嗅骄,自定義相機就不寫出來了胳挎,步驟如下:


//初始化
public static List<AFT_FSDKFace> resultAtf;
AFT_FSDKEngine engine;
AFT_FSDKError err;
AFR_FSDKEngine engine2;
AFR_FSDKError error2;
AFR_FSDKFace result;
byte[] faceData;
resultAtf = new ArrayList<>();
engine = new AFT_FSDKEngine();
err = engine.AFT_FSDK_InitialFaceEngine(FaceDB.appid, FaceDB.ft_key, AFT_FSDKEngine.AFT_OPF_0_HIGHER_EXT, 16, 5);
err = engine.AFT_FSDK_GetVersion(new AFT_FSDKVersion());
engine2 = new AFR_FSDKEngine();

result = new AFR_FSDKFace();
error2 = engine2.AFR_FSDK_InitialEngine(FaceDB.appid, FaceDB.fr_key);
error2 = engine2.AFR_FSDK_GetVersion(new AFR_FSDKVersion());
//需要設置相機預覽圖片的格式
para.setPreviewFormat(ImageFormat.NV21);
//相機預覽回調獲取數(shù)據(jù)
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();
            }
        }
    };

獲取到數(shù)據(jù)后獲取人臉特征然后開始對比,方法就是這樣溺森,邏輯可以自己設計慕爬,也可以根據(jù)獲取到的人臉數(shù)據(jù)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();

//這是獲取我保存的人臉數(shù)據(jù),就是有個名字加一個人臉特征
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();

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市炊林,隨后出現(xiàn)的幾起案子姥卢,更是在濱河造成了極大的恐慌,老刑警劉巖渣聚,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件独榴,死亡現(xiàn)場離奇詭異,居然都是意外死亡奕枝,警方通過查閱死者的電腦和手機棺榔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隘道,“玉大人症歇,你說我怎么就攤上這事√饭#” “怎么了忘晤?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長激捏。 經常有香客問我设塔,道長,這世上最難降的妖魔是什么远舅? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任闰蛔,我火速辦了婚禮竞思,結果婚禮上,老公的妹妹穿的比我還像新娘钞护。我一直安慰自己,他們只是感情好爆办,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布难咕。 她就那樣靜靜地躺著,像睡著了一般距辆。 火紅的嫁衣襯著肌膚如雪余佃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天跨算,我揣著相機與錄音爆土,去河邊找鬼。 笑死诸蚕,一個胖子當著我的面吹牛步势,可吹牛的內容都是我干的。 我是一名探鬼主播背犯,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼坏瘩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了漠魏?” 一聲冷哼從身側響起倔矾,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎柱锹,沒想到半個月后哪自,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡禁熏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年壤巷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匹层。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡隙笆,死狀恐怖,靈堂內的尸體忽然破棺而出升筏,到底是詐尸還是另有隱情撑柔,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布您访,位于F島的核電站铅忿,受9級特大地震影響,放射性物質發(fā)生泄漏灵汪。R本人自食惡果不足惜檀训,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一柑潦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧峻凫,春花似錦渗鬼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至命锄,卻和暖如春堰乔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背脐恩。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工镐侯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人驶冒。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓苟翻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親只怎。 傳聞我的和親對象是個殘疾皇子袜瞬,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內容