趁晚上的時(shí)間向大家分享一波干貨。
虹軟的人臉識(shí)別是應(yīng)用與離線開發(fā)的,因?yàn)椴恍枰W(wǎng)絡(luò),所以它的識(shí)別速度較快。好了,廢話不多說,接下來就開始教大家怎樣使用了。
1.首先就是去官網(wǎng)申請(qǐng)APPKEY,各種密匙,然后在下載jar包,這些就不一一給大家講解了。注意一下,要在app的gradle里面加上這句話,不然可能會(huì)造成so庫加載不了的錯(cuò)誤。
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
2.接下里就需要進(jìn)行開發(fā)了。就拿人臉檢測(cè)的功能來說吧,首先需要 對(duì)引擎初始化,
AFD_FSDKEngine engine1 = new AFD_FSDKEngine(); AFD_FSDKError err = engine1.AFD_FSDK_InitialFaceEngine(Config.APP_ID, Config.FD_KEY, AFD_FSDKEngine.AFD_OPF_0_HIGHER_EXT, 16, 5);
我們還需要一個(gè)集合,用來存放我們檢測(cè)到的人臉,
List<AFD_FSDKFace> result = new ArrayList<AFD_FSDKFace>();//新建AFD_FSDKFacejihe,用于存放識(shí)別的人臉信息
接下來我們就可以進(jìn)行人臉的檢測(cè)了,但是對(duì)于照片的選取和格式是有要求的,所以我們需要對(duì)照片進(jìn)行格式處理一下。
Bitmap bitmap1 = decodeImage(path1);//path是照片的路徑,先選取照片,轉(zhuǎn)化為bitmap
byte[] data1 = getNv21(bitmap1);//再將bitmap轉(zhuǎn)化為NV21格式的
下面是工具類decodeImage和getNv21的代碼:
//getNv21 和 decodeImage 是照片格式的轉(zhuǎn)化工具
public byte[] getNv21(Bitmap mBitmap) {
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.e("TAG", "convert ok!");
}
convert.destroy();
return data;
}
public static Bitmap decodeImage(String path) {
Bitmap res;
try {
ExifInterface exif = new ExifInterface(path);
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
BitmapFactory.Options op = new BitmapFactory.Options();
op.inSampleSize = 1;
op.inJustDecodeBounds = false; //op.inMutable = true;
res = BitmapFactory.decodeFile(path, op); //rotate and scale.
Matrix matrix = new Matrix();
if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
matrix.postRotate(90);
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {
matrix.postRotate(180);
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
matrix.postRotate(270);
}
Bitmap temp = Bitmap.createBitmap(res, 0, 0, res.getWidth(), res.getHeight(), matrix, true);
Log.d("com.arcsoft", "check target Image:" + temp.getWidth() + "X" + temp.getHeight());
if (!temp.equals(res)) {
res.recycle();
}
return temp;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
```
對(duì)格式進(jìn)行轉(zhuǎn)化完成后,就開始進(jìn)行人臉的檢測(cè)了。```
err = engine1.AFD_FSDK_StillImageFaceDetection(data1, bitmap1.getWidth(), bitmap1.getHeight(), AFD_FSDKEngine.CP_PAF_NV21, result); Log.e("TAG", "getBit: " + result.size());
我們可以查看集合result的size,來確定是否檢測(cè)到人臉。 在代碼的最后,一定要對(duì)初始化的引擎進(jìn)行銷毀處理。不然程序會(huì)因?yàn)閮?nèi)存問題而崩潰。 engine1.AFD_FSDK_UninitialFaceEngine();
人臉對(duì)比是在人臉檢測(cè)的基礎(chǔ)上進(jìn)行的,在一張照片上先檢測(cè)到人臉的信息,然后再將人臉的信息進(jìn)行比對(duì)。 List result = new ArrayList(); 上面已經(jīng)介紹了,檢測(cè)到的人臉信息都是存放在result的集合中的, 然后是創(chuàng)建兩個(gè)存放人臉點(diǎn)位信息的類
AFR_FSDKFace face1 = new AFR_FSDKFace();
AFR_FSDKFace face2 = new AFR_FSDKFace(); 將檢測(cè)到的人臉信息的點(diǎn)位信息存放到 face類中
//新建兩個(gè)AFR_FSDKFace類,保存人臉特征信息
AFR_FSDKFace face1 = new AFR_FSDKFace();
AFR_FSDKFace face2 = new AFR_FSDKFace(); //對(duì)人臉特征信息的檢測(cè)
er = engine_camera.AFR_FSDK_ExtractFRFeature(data_image,
bitmap_idcard.getWidth(),
bitmap_idcard.getHeight(),
AFR_FSDKEngine.CP_PAF_NV21,
new Rect(result_image.get(0).getRect()),
result_image.get(0).getDegree(),
face1);
er = engine_camera.AFR_FSDK_ExtractFRFeature(data,
wid,
hei,
AFR_FSDKEngine.CP_PAF_NV21,
new Rect(result_fd.get(0).getRect()),
result_fd.get(0).getDegree(),
face2);
最后的比對(duì)的相似度信息存放在score中, float score_face = score.getScore();
我們可以通過這種方式得到 我們想要的相似度信息,最后得到的數(shù)據(jù)是float類型的。
*注意! 在使用照片的時(shí)候,分辨率大小最好是偶數(shù)的,不然會(huì)發(fā)生未知的錯(cuò)誤。 在進(jìn)行人臉信息提取的時(shí)候,會(huì)耗時(shí),耗時(shí)的時(shí)長,是根據(jù)設(shè)備的CPU處理能力來說的。
轉(zhuǎn)載于:https://www.cnblogs.com/Zzz-/p/10790708.html
創(chuàng)作挑戰(zhàn)賽 新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)
總結(jié)
以上是生活随笔 為你收集整理的【分享】虹软人脸识别应用开发过程 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。