上一节叙述了利用百度在线人脸接口和百度人脸识别离线SDK实现人脸识别的两种方式。
第一种方法是使用在线面部搜索api接口识别在线面部库中存储的面部照片。 但是,经过进一步调查,在线面部搜索界面需要使用面部照片。 照片为BASE64类型,传送到在线面部搜索api接口。 这样,当然可以在多个图像类型中捕获界面提示。 这里使用的是BASE64型。 其实我推荐使用base64型的图像。 因为这个接口还可以传输图像的face_token。 但是,如果用照相机实时获取图像,则无法获取face_token,所以只能将图像传输到在线面部搜索界面进行识别。
要去看代码:先准备3360百度的脸部识别离线SDK。 本例程序:
登录百度云账户:登录https://ai.Baidu.com/ai-doc/face/7k37c1twu
这个地方可以下载脸部识别安卓的SDK
点击进去,
然后点击:立即使用
点击此处下载SDK
然后,根据需要选择安卓程序:
然后开始施工后:
caption">
这个代码中可以看到上面有个,生活照检索:
可以看到,标注的地方,原来有注释掉的代码,上面是我新添加的代码,这里我在
//--->这里可以获取相机捕获的人脸图片 2021年10月19日15:12:54 Bitmap bitmap= BitmapUtils.getInstaceBmp(rgbInstance.getImage()); //--->根据faceToken 去搜索尝试 featureSearchOnline(livenessModel,bitmap,feature);这里获取了,实时的摄像头照片以后,这里获取实时的摄像头照片是sdk自己带有的功能,
然后拿到这个bitmap,然后把图片上传给featureSearchOnline 这个自己写的方法,
//2021年10月20日15:22:51 // private void featureSearchOnline(LivenessModel livenessModel,Bitmap bitmap,byte[] feature) { long startFeature = System.currentTimeMillis(); String faceToekn = getFaceToken(feature); //1.获取百度云TOKEN String tokenStr = BaiDuAuthServiceUtils.getAuth(); String groupId ="XXXXX"; String base64Str = BitmapBaiDuUtils.bitmapToBase64(bitmap); //FACE_TOKEN String searlt = ""; searlt= BaiDuFaceSearchUtils.faceSearch(tokenStr,"BASE64",groupId,base64Str); System.out.println(searlt); Log.e("face_token--->0001",searlt); if(StringUtils.isNotBlank(searlt)){ JSONObject jsonObj= null; JSONArray respFaceArray= null; try { jsonObj = new JSONObject(searlt); if(jsonObj.getString("error_msg").equals("SUCCESS")){ respFaceArray=new JSONObject(jsonObj.getString("result")).getJSONArray("user_list"); if(respFaceArray!=null && respFaceArray.length()>0){ JSONObject userJsonObj = new JSONObject(respFaceArray.getString(0)); String groupIdStr = userJsonObj.getString("group_id"); String userIdStr =userJsonObj.getString("user_id"); String userInfoStr = userJsonObj.getString("user_info"); String userScore = userJsonObj.getString("score"); //1.识别成功 构建User 返回 User user = new User(); user.setGroupId(groupIdStr); user.setUserId(userIdStr); user.setUserInfo(userInfoStr); user.setFeature(feature); user.setUserName("测试用户"); Float faceScore =0.0f; faceScore =Float.parseFloat(userScore); //人脸识别 阈值设置为 80 if(faceScore>=80){ livenessModel.setUser(user); livenessModel.setFeatureScore(Float.parseFloat(userScore)); } } } }catch (Exception e){ e.printStackTrace(); } livenessModel.setCheckDuration(System.currentTimeMillis() - startFeature); } }然后看看这个自己写的方法,
可以看到这个方法,首先获取了这个图片的base64字符串,然后把这个字符串,传给了,
BaiDuFaceSearchUtils.faceSearch这个百度人脸在线搜索的接口,进行人脸搜索.
可以看到这里特别重要,每次搜索以后,返回的是个集合,一般是返回一个,当然如果,在人脸库中,一个人的user_id下,存了多个人脸,那么会返回一个集合,那么这里我获取的第一个就可以了.
这里一定要注意,设置一个阈值,这里一般设置阈值是80就可以了.
这里写好了以后,他识别成功以后,会自动的回调,回调的时候就会走到:
走到这里,这就相当于人脸登录成功了,然后就可以写自己的业务了.
然后上一节说的,第二种方式,先把远程百度云人脸库的内容,同步到本机的平板上的话,那么需要
先使用,人脸特征值转换的一个在线api接口,把face_token,转换成人脸特征值,然后再存入,本地
平板上,这样才能进行,人脸的离线识别.
因为在线识别的时候,用的是face_token来标记人脸,离线识别的时候,用的是人脸特征值,
所以,这个时候,先把百度云在线人脸库中存的,人脸的face_token,转换成人脸特征值,再
存入本地才能使用了.
https://cloud.baidu.com/doc/FACE/s/Okg7edktq
人脸特征值和face_token转换的接口在这里,这个不太好找:
截个图保存一下,他是在SDK文档中的.