博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
虹软人脸识别的应用开发过程分享
阅读量:5346 次
发布时间:2019-06-15

本文共 3329 字,大约阅读时间需要 11 分钟。

虹软的人脸识别是应用与离线开发的,因为不需要网络,所以它的识别速度较快。

好了,废话不多说,接下来就开始教大家怎样使用了。

1.首先就是去官网申请APPKEY,各种密匙,然后在下载jar包,这些就不一一给大家讲解了。注意一下,要在app的gradle里面加上

sourceSets { main { jniLibs.srcDirs = ['libs'] } }

  

这句话,不然可能会造成so库加载不了的错误。

2.接下里就需要进行开发了。

就拿人脸检测的功能来说吧,首先需要
对引擎初始化,

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
result = new ArrayList
();//新建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,

  

最后的比对的相似度信息存放在score中, float score_face = score.getScore();
我们可以通过这种方式得到 我们想要的相似度信息,最后得到的数据是float类型的。
*注意!
在使用照片的时候,分辨率大小最好是偶数的,不然会发生未知的错误。
在进行人脸信息提取的时候,会耗时,耗时的时长,是根据设备的CPU处理能力来说的。

 

转载于:https://www.cnblogs.com/Zzz-/p/10795487.html

你可能感兴趣的文章
MES架构
查看>>
【Python3 爬虫】15_Fiddler抓包分析
查看>>
高性能JavaScript-JS脚本加载与执行对性能的影响
查看>>
关于标签之间因为换行等问题造成的空白间距问题处理
查看>>
hdu 2767(tarjan)
查看>>
sklearn之分类模型混淆矩阵和分类报告
查看>>
MySQL各存储引擎
查看>>
项目--简单导出CSV文件
查看>>
Oracle session相关数据字典(一)
查看>>
织梦文章内容提取第一张或者多张图片输出
查看>>
C#用正则表达式 获取网页源代码标签的属性或值
查看>>
BZOJ 3399 [Usaco2009 Mar]Sand Castle城堡(贪心)
查看>>
WCF(一) 简单的认知
查看>>
[MFC][DShow]简单例子
查看>>
降序排列
查看>>
十一、类型转换
查看>>
面试内容,值得一看
查看>>
UILabel
查看>>
【热门技术】三种SEO方式
查看>>
[Hades_技术]哈迪斯初级技术应用
查看>>