Unity接入ArcSoftFaceRecognitionAndroidSDK==自行修改aar包开发Android应用下载链接在下方所有demoaar包==简要说明:根据需要工作项目中使用人脸识别功能,借此机会发布一下sdk的使用过程,踩过的坑。使用ArcSoftFaceRecognition2.0开发demo测试,然后升级到3.1。此处仅使用3.1版。注册企业开发者账号短期试用代码使用非常方便。Unity调用AndroidStudioaar包的方法可以在CSDN上搜索到。陷阱和注意事项将在本文中进行说明。具体细节就不介绍了。demo内容自行参考。本文仅介绍过程和注意事项。具体功能请参考SDKPDF官网。SDK中有Demo和PDF文件可供查看,但只涉及单一版本,不涉及多软件、多语言开发。请注明出处,谢谢。Demo详细介绍到实机使用1.在打包unity的keystroe时获取Android机器唯一识别码从头到尾创建一个keystroe,就用这个keystroe因为机器唯一识别码会也记录下你的软件信息2.生成的txt文件1k左右。去官网上传离线激活。按照步骤进行操作。文件名是什么并不重要。下载的.dat激活文件只能在您刚刚获取激活码的设备上使用。.Demo项目一开始打算做活体检测。考虑到只是登录的问题,我们就用图片引擎比对人脸签名吧,简单快捷。很舒服。按键的名字就可以看出是什么功能,只不过是开启了视频引擎,没有活体检测。老实说,这并不有趣,因为主要逻辑在aar包中,而Unity只是调用//////初化图片引擎///privatevoidInitImageFunc(){object[]objs=新对象[]{FaceEngineConst.ASF_DETECT_MODE_IMAGE,FaceEngineConst.ASF_OP_ALL_OUT,32,1,FaceEngineConst.ASF_FACE_DETECT|FaceEngineConst.ASF_FACE_RECOGNITION};currentActivity.Call("initEngine",objs);InitFace_All.interactable=true;}//////激活离线引擎///privatevoidActiveFunc(){if(currentActivity!=null){return;}AndroidJavaClassandroidJavaClass=newAndroidJavaClass("com.unity3d.player.UnityPlayer");currentActivity=androidJavaClass.GetStatic("currentActivity");currentActivity.Call("initCurrentActivity");object[]objs=newobject[]{"unityAppCode.dat"};布尔isOk=currentActivity.Call("activeFaceEngine",objs);如果(isOk){InitImage.interactable=isOk;InitVideo.interactable=isOk;}else{Debug.LogError("离线激活有问题");}}4.工程打包后,将官网.dat放在设备指定路径下。设备离线激活文件aar包中的路径是这样的。Unity将“文件名.dat”传入aar包进行逻辑处理publicbooleanactiveFaceEngine(StringfileFullPath)throwsIOException{havePermission();//.dat离线激活文件读取路径Stringpath=Environment.getExternalStorageDirectory().getAbsolutePath()+"/Dat/"+fileFullPath;Log.i(TAG,"activeFaceEngine:"+路径);文件文件=新文件(路径);如果(file.exists()){Log.i(TAG,"activeFaceEngine:"+file.getAbsolutePath());}intactiveOfflineError=FaceEngine.activeOffline(thisContext,path);布尔值isActive=false;字符串通知=空;开关(activeOfflineError){caseErrorInfo.MOK:notice="引擎启动成功";是活动的=真;休息;caseErrorInfo.MERR_ASF_ALREADY_ACTIVATED:notice="Activated";是活动的=真;休息;休息;default:notice="引擎激活失败,错误码errorInfo:"+activeOfflineError;休息;}DialogShow("提示",通知);不方便演示。基本的操作步骤大概贴出来了,基本没问题一、软件工具版本介绍Unity版本2017.4.1f、2018.4.35fAndroid版本4.2.2ArcSoftSDK版本3.1AndroidSDK21-29apiJDK版本jdk1.8.0_181实测机型Android10,CPUArm-v8a2。FacialSDKcore功能使用介绍Engine在线激活,离线激活具体操作可以根据Api调用,具体官方文档有更详细的使用文档Java代码官方SDKjar包内容//在线激活导入context激活keykeyid从sdkkey官网获取publicstaticintactiveOnline(Contextcontext,StringactiveKey,StringappId,StringsdkKey)文本应用,安卓10以下机型可以直接官网下载app获取,自己写个小工具publicstaticintgetActiveFileInfo(Contextcontext,ActiveFileInfoactiveFileInfo){/*看代码Demo*/}//离线激活使用官网下载的dat二进制激活文件激活引擎publicstaticintactiveOffline(Contextcontext,StringfilePath){/*看代码Demo里面*/}C#代码调用的aar包自己修改//离线激活Unity上直接调androidaar包里的方法。所有与人脸相关的操作都是通过aar包中的内容来完成的。C#只进行调用//减少相互参数传递AndroidJavaClassandroidJavaClass=newAndroidJavaClass("com.unity3d.player.UnityPlayer");currentActivity=androidJavaClass.GetStatic("currentActivity");currentActivity.Call("初始化CurrentActivity");object[]objs=newobject[]{"unityAppCode.dat"};boolisOk=currentActivity.Call("activeFaceEngine",objs);2.引擎初始化java代码//引擎初始化在lowlevel版本中部分参数为long类型,后面有封装的枚举类型,但都是一样的,具体API介绍见SDK文档detectFaceMaxNum,intcombinedMask)3.PeopleFacecapture//老版本升级用的名字还是这个,其实下面就是增加一个capturemodel来枚举RGB模式,这个不看so库。我不知道我做了什么。publicintdetectFaces(byte[]data,intwidth,intheight,intformat,ListfaceInfoList){returnthis.detectFaces(data,width,height,format,DetectModel.RGB,faceInfoList);}//3.1这里使用publicintdetectFaces(byte[]data,intwidth,intheight,intformat,DetectModeldetectModel,ListfaceInfoList){/*看里面的代码Demo*/}//也可以使用最新的数据封装类进行数据封装传输,上面下面的都可以用,看具体要求publicintdetectFaces(ArcSoftImageInfoarcSoftImageInfo,ListfaceInfoList){returnthis.detectFaces(arcSoftImageInfo,DetectModel.RGB,faceInfoList);}publicintdetectFaces(ArcSoftImageInfoarcSoftImageInfo,DetectModeldetectModel,ListfaceInfoList){/*看里面代码demo*/}有趣的操作,将二进制数据永久保存图片和人脸特征码都在文件文件里,这样运行起来很方便,需要做一个专门的人脸信息数据输入工具软件//Java代码人脸特征码计算publicintextractFaceFeature(byte[]data,intwidth,intheight,intformat,FaceInfofaceInfo,intthreadCount,FaceFeaturefeature){}//这个是人脸特征码封装类的具体数据是一堆二进制数据publicclassFaceFeature{publicstatic最终intFEATURE_SIZE=1032;byte[]特征数据;publicFaceFeature(FaceFeatureobj){if(obj==null){this.featureData=newbyte[1032];}else{this.featureData=(byte[])obj.getFeatureData().clone();}}publicFaceFeature(){this.featureData=newbyte[1032];}publicFaceFeature(byte[]data){this.featureData=data;}公共字节[]getFeatureData(){返回this.featureData;}publicvoidsetFeatureData(byte[]data){this.featureData=data;}publicFaceFeatureclone(){returnnewFaceFeature(this);}}5。人脸特征码比较//比较是比较两个特征码比较容易得到相似度结果。如果相似度结果大于0.8f,说明是同一个人。这个门槛是官网推荐的。publicintcompareFaceFeature(FaceFeaturefeature1,FaceFeaturefeature2,FaceSimilarfaceSimilar){returnthis.compareFaceFeature(feature1,feature2,CompareModel.LIFE_PHOTO,faceSimilar);}//publicintcompareFaceFeature(FaceFeaturefeature1,FaceFeaturefeature2,CompareModelcompareModel,FaceSimilarfaceSimilar){}6.获取各种人脸信息//这样没用看官方文档介绍,里面会有publicintprocess(ArcSoftImageInfoarcSoftImageInfo,ListfaceInfoList,intcombinedMask){/*看代码Demo*/}//这是人脸等信息功能界面,可以直接获取当前图片人脸中间的人脸年龄性别等信息前提必须是combineMask组合函数包含你要的功能/*其他包括活体检测,都是套路,代码看得懂用什么都ok,java和C#孪生兄弟也很好理解,相同点和矛盾点太多了。这很容易理解。三、Unity注意事项1、Unity导入arr包。值得注意的是内外配置表的问题,以及需要删除的地方Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes\classes.jar在Unity中的jar包路径2.Unity导入arr包注意事项3.打包和离线激活,注意事项4.Android注意事项1.结构信息Android项目的构建2.Android项目的构建信息按照这个样子基本没问题。值得注意的是修改点有个同步按钮,点击build按钮重新调整工程。五、Bug和Androidadblogcat在真机上的测试在测试开发者中心,可以查看使用返回的错误码,解决引擎使用过程中出现的问题。用cmd跳转到你的sdkplatformtools,用开发者模式将电脑连接到android机上,查看真机运行日志。打开androidstudio可以在logcat视图中查看。文末内容错别字较多,以免耽误阅读。避免这些陷阱意味着减少开发时间。下面贴出下载地址为aar包下载路径UnityFaceDemo机器识别码获取Demoapk,需要使用unity.keystore自行生成想要了解更多人脸识别产品请到虹软视觉开放平台