趁空闲的一点点时间向你们分享一个好用的人脸识别的应用——来自虹软公司的人脸识别html
推荐这家的产品主要有如下几个理由~c++
它家比较良心。人脸识别、人证核验、活体检测等等一切的sdk都是免费下载使用的- -即便商用也能够~很是适合我这种小穷人bash
目前可下载Windows x86,x64平台(c++/Java语言)、Linux x64平台(c++/Java语言)、iOS平台(Objective-C语言)与Android arm32平台(Java语言)
网络
这里丢个地址来算了……想试用demo的能够去下:ai.arcsoft.com.cn/ucenter/res…app
除官方提供的demo之外,如需使用其它语言开发,也能够自行封装。
工具
只有首次激活须要联网,后面就均可以离线用了,比较方便~post
好了,废话很少说,接下来就开始教你们怎样使用了。 gradle
1. 首先就是去官网申请APPKEY,各类密匙,而后在下载jar包,这些就不一一给你们讲解了。注意一下,要在app的gradle里面加上这句话,否则可能会形成so库加载不了的错误。ui
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
复制代码
2. 接下来就须要进行开发了。就拿人脸检测的功能来讲吧,首先须要 对引擎初始化spa
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); 复制代码
咱们还须要一个集合,用来存放咱们检测到的人脸
List<AFD_FSDKFace> result = new ArrayList<AFD_FSDKFace>();//新建AFD_FSDKFacejihe,用于存放识别的人脸信息 复制代码
接下来咱们就能够进行人脸的检测了,可是对于照片的选取和格式是有要求的,因此咱们须要对照片进行格式处理一下。
Bitmap bitmap1 = decodeImage(path1);//path是照片的路径,先选取照片,转化为bitmap
byte[] data1 = getNv21(bitmap1);//再将bitmap转化为NV21格式的 复制代码
下面是工具类decodeImage和getNv21的代码:
//getNv21 和 decodeImage 是照片格式的转化工具
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;
} 复制代码
对格式进行转化完成后,就开始进行人脸的检测了。
err = engine1.AFD_FSDK_StillImageFaceDetection(data1, bitmap1.getWidth(), bitmap1.getHeight(), AFD_FSDKEngine.CP_PAF_NV21, result); Log.e("TAG", "getBit: " + result.size()); 复制代码
咱们能够查看集合result的size,来肯定是否检测到人脸。 在代码的最后,必定要对初始化的引擎进行销毁处理。否则程序会由于内存问题而崩溃。 engine1.AFD_FSDK_UninitialFaceEngine(); 人脸对比是在人脸检测的基础上进行的,在一张照片上先检测到人脸的信息,而后再将人脸的信息进行比对。 List result = new ArrayList(); 上面已经介绍了,检测到的人脸信息都是存放在result的集合中的, 而后是建立两个存放人脸点位信息的类
AFR_FSDKFace face1 = new AFR_FSDKFace();
AFR_FSDKFace face2 = new AFR_FSDKFace(); 将检测到的人脸信息的点位信息存放到 face类中
//新建两个AFR_FSDKFace类,保存人脸特征信息
AFR_FSDKFace face1 = new AFR_FSDKFace();
AFR_FSDKFace face2 = new AFR_FSDKFace(); //对人脸特征信息的检测
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); 复制代码
最后的比对的类似度信息存放在score中, float score_face = score.getScore(); 咱们能够经过这种方式获得 咱们想要的类似度信息,最后获得的数据是float类型的。
一、在使用照片的时候,分辨率大小最好是偶数的,否则会发生未知的错误。 图像尺寸限制宽高大于0,宽度为4的倍数,YUYV/I420/NV21/NV12格式的图片高度为2的倍数,BGR24格式的图片高度不限制。
二、在进行人脸信息提取的时候,会耗时,耗时的时长,是根据设备的CPU处理能力来讲的。
好了,先分享这么多,后面再慢慢写使用体会,也欢迎你们与我交流~
若是有想体验虹软人脸识别功能的,连接拿去~:ai.arcsoft.com.cn/product/arc…