前言:
今天小伙伴们对“百度在线识别图片找原图”大体比较讲究,我们都需要了解一些“百度在线识别图片找原图”的相关知识。那么小编同时在网络上收集了一些关于“百度在线识别图片找原图””的相关知识,希望姐妹们能喜欢,咱们快快来学习一下吧!1.基于上一节,我们已经把百度云上的人脸库,建好了,然后我们可以从,百度云官网拿到,
离线人脸识别的SDK.
SDK下载_文字识别SDK_语音识别SDK-百度AI开放平台 这里可以点进去下载
2.然后我们就可以基于给的官网示例去,进行人脸识别了.
人脸识别有两种方式:
第一种:基于示例代码,获取摄像头的,视频流中的图片,然后,把图片发送给百度云人脸识别API,
利用人脸搜索的API,来进行,在人脸库中搜索该人脸,如果搜索到了,并且人脸分值符合
标准,就认为找到该人脸了.这种方式只利用百度云人脸识别的在线API就可以实现.
a.这种方式,首先获取摄像头视频流中的图片是在:
这里加上这句,就可以获取到视频流中的图片,然后把图片,可以再调用下面的featureSearch方法的时候把,bitmap传递进去.
然后在featureSearch方法中,根据:
featureCheckMode自己写个分支.
然后,可以根据传过来的图片,把图片传递给百度云的,在线人脸库搜索的API,根据API返回的搜索到的user_id
然后去自己的数据库中查询这个用户,根据用户信息,如果能查到,说明人脸登录成功.
第二种:基于示例代码,每次识别人脸之前,先去,百度云人脸库,把人脸库图片,同步到本地的,平板
电脑上,然后再利用百度人脸识别,离线SDK去识别人脸.这种方式是利用百度云离线SDK+
百度云在线API实现的.这种方式是,在打开,人脸识别摄像头页面之前,先去同步一下百度云的人脸库,到
本地.也就是在调用下面的代码,之前,先去请求一下,百度人脸库的获取API,获取人脸到本地库中.
下面是同步人脸库的做法,之前人脸库,我们是自己做了一个人脸库,在本地做的,请求的是我们自己的服务器,人脸入库,sdk,中本来就有
对应的代码,可以去看一下:实现就可以
参考代码:
//4.同步人脸库操作 private void faceAsyncLogin() {// Toast.makeText(HomeActivity.this, "本机人脸数据开始同步",// Toast.LENGTH_SHORT).show(); //人脸数据正在加载。。。。。。 //ToastUtils.toast(HomeActivity.this, "正在加载人脸,请稍等..."); //1.这里去同步照片到人脸库 //String faceUrl=";; String server_ip = GetConfigValue.getConfigProperties("server_ip"); //String faceUrl=";; String faceUrl= server_ip +"/api/faceDevice/listByIp"; OkHttpClient faceHttpClient = new OkHttpClient(); Request faceRequest = new Request.Builder() .get() .url(faceUrl) .build(); //构造Call对象 Call faceCall=faceHttpClient.newCall(faceRequest); faceCall.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { ToastUtils.toast(HomeActivity.this, "网络连通失败"); ToastUtils.toast(HomeActivity.this, "人脸加载失败,请稍后再试"); } @Override public void onResponse(Call call, okhttp3.Response response) throws IOException { //1.将base64,转换为图片 try { reentrantLock.lock(); String jsonStr =response.body().string(); respFaceArray=null; //清空一下 JSONObject jsonObj=new JSONObject(jsonStr); respFaceArray =jsonObj.getJSONArray("data"); linkedQueue.enQueue(respFaceArray); uiHandler.sendEmptyMessage(141); response.body().close(); reentrantLock.unlock(); } catch (JSONException e) { ToastUtils.toast(HomeActivity.this, "服务器异常"); ToastUtils.toast(HomeActivity.this, "人脸加载失败,请稍后再试"); e.printStackTrace(); response.body().close(); } } }); }
public Handler uiHandler = new Handler() { public void handleMessage(Message msg) { if (msg.what == 110) { //同步登陆二维码// ImageView codeView = (ImageView)findViewById(R.id.codebutton);// codeView.setImageBitmap(qrCode);// ToastUtils.toast(HomeActivity.this, "登录二维码获取成功"); }else if(msg.what==115){//同步用户信息 Log.e("ets","ssss"); }else if (msg.what==131){ reentrantLock.lock(); //改成使用linkedqueue自定义的queue来操作 while (linkedQueue.isQueueEmpty() == false){ JSONArray jsonArray = (JSONArray) linkedQueue.deQueue(); faceServerHttp(jsonArray); } reentrantLock.unlock(); } else if (msg.what==141){ reentrantLock.lock(); //改成使用linkedqueue自定义的queue来操作 while (linkedQueue.isQueueEmpty() == false){ JSONArray jsonArray = (JSONArray) linkedQueue.deQueue(); //if(jsonArray!=null && jsonArray.length()>0){ faceServerHttpLogin(jsonArray);// }else{// //ToastUtils.toast(HomeActivity.this,"人脸加载成功!");// ToastUtils.toast(HomeActivity.this, "人脸加载中,请稍等...");// Timer timer = new Timer();// TimerTask timerTask = new TimerTask() {// @Override// public void run() {// ToastUtils.toast(HomeActivity.this, "人脸数据加载成功");// uiHandler.sendEmptyMessage(151);// }// };// timer.schedule(timerTask,4000);// } } reentrantLock.unlock(); } else if (msg.what==151){ //timer人脸同步定时器 Timer faceTimer = new Timer(); TimerTask timerTask = new TimerTask() { @Override public void run() { mLiveType = com.baidu.idl.main.facesdk.model.SingleBaseConfig.getBaseConfig().getType(); judgeLiveType(mLiveType, FaceRGBGateActivity.class, FaceNIRGateActivriy.class, FaceDepthGateActivity.class, FaceRgbNirDepthGataActivity.class); } }; faceTimer.schedule(timerTask,2300); } else { ToastUtils.toast(HomeActivity.this, "下载文件失败,请检查网络连接");// Toast.makeText(HomeActivity.this, "下载文件失败,请检查网络连接",// Toast.LENGTH_SHORT).show(); } } };
private synchronized void faceServerHttpLogin(JSONArray respFaceArray) { //同步人脸数据 mFinishCount = 0; // 已完成的图片数量 mSuccessCount = 0; // 已导入成功的图片数量 mFailCount = 0; // 已导入失败的图片数量 try { boolean success = false; // 判断成功状态 List<String> faceIds =new ArrayList<String>(); //System.out.println("人脸库同步中,请稍等"); //ToastUtils.toast(HomeActivity.this, "人脸库同步中,请稍等"); for (int i = 0; i < respFaceArray.length(); i++) { JSONObject faceJson = respFaceArray.getJSONObject(i); //1.去判断人脸库中是否已经有该人脸 String faceDataStr = faceJson.getString("faceImage"); Log.e("TAG01","人脸照片---001:"+faceDataStr); //2.开始获取照片 if (StringUtils.isNotNUll(faceDataStr) && StringUtils.isNotEmpty(faceDataStr)) { //1.获取要导入的人脸照片 Bitmap faceImg = ImageUtils.stringToBitmap(faceDataStr); //这个默认就是JPG的图片,不用检测 //2.获取要导入照片的ID int faceId = faceJson.getInt("faceId"); final int userId = faceJson.getInt("userId"); //Log.e("TAG01","人脸ID:"+faceId); //Log.e("TAG01","用户ID:"+userId); //3.获取用户的年龄 int age =faceJson.getInt("age"); //Log.e("TAG01","用户年龄:"+age); //4.获取用户的生日 String birthday = faceJson.getString("birthday"); //Log.e("TAG01","用户生日:"+birthday); //5.获取身高 int height = faceJson.getInt("height"); //Log.e("TAG01","用户身高:"+height); //6.获取性别 String sex = faceJson.getString("sex"); //Log.e("TAG01","用户性别:"+sex); String faceName = faceJson.getString("userName"); //7.用户信息绑定字符串 String bind_user_str = ""; //bind_user_str = "{" + "faceId"+ ":" +faceId+","+ "userId"+ ":" +userId+","+"age"+":"+age+","+"birthday"+":"+birthday+","+"height"+":"+height+","+"sex"+":"+sex+","+"userName"+":"+faceName+"}"; bind_user_str = "{" + "faceId"+ ":" +"\""+faceId+"\""+","+ "userId"+ ":" +"\""+userId+"\""+","+"age"+":"+"\""+age+"\""+","+"birthday"+":"+"\""+birthday+"\""+","+"height"+":"+"\""+height+"\""+","+"sex"+":"+"\""+sex+"\""+","+"userName"+":"+"\""+faceName+"\""+"}"; Log.e("TAG01","用户内容:"+bind_user_str); //faceName="张三" + i ; //------暂时没有传入faceName写入临时名字 //3.根据人脸ID,查询数据库与文件中对应的姓名是否相等,如果相等,则直接过滤 //User user = FaceApi.getInstance().getUserListById(faceId); List<User> users = FaceApi.getInstance().getAllUserList(); User user = null; //从已经存储的用户列表中去查询该用户是否已经入库 try{ if(users!=null){ for (User curUser : users) { Log.e("TAG--",""+curUser.getUserId()); if(curUser.getUserId().equals(String.valueOf(faceId))){ user =curUser; break; } } } }catch (Exception e){ e.printStackTrace(); } if (user != null) { //4.该人脸已经存在不需要进行同步了 Log.e("TAG01","该人脸已经存在了---》:"+faceId+"_Ok"); faceIds.add(faceId+"_Ok"); continue; } else { Log.e("TAG01","人脸入库开始---》"); //5.去把该人脸入库 if (faceImg == null) { //6.不是一张bitmap图片,过滤 faceIds.add(faceId+"_Fail"); //ToastUtils.toast(HomeActivity.this, "不是合法的图片"); continue; } //6.图片缩放 if (faceImg.getWidth() * faceImg.getHeight() > 3000 * 2000) { if (faceImg.getWidth() > faceImg.getHeight()) { float scale = 1 / (faceImg.getWidth() * 1.0f / 1000.0f); faceImg = BitmapUtils.scale(faceImg, scale); } else { float scale = 1 / (faceImg.getHeight() * 1.0f / 1000.0f); faceImg = BitmapUtils.scale(faceImg, scale); } } //7.走人脸SDK接口,通过人脸检测、特征提取拿到人脸特征值 byte[] bytes = new byte[512]; ImportFeatureResult result; //8.走人脸SDK接口,通过人脸检测、特征提取拿到人脸特征值 result = FaceApi.getInstance().getFeature(faceImg, bytes, BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO); Log.e("HomeActivity", "-------------------------------::::::::HttpServerHttpServer" + result.getResult()); System.out.println("-------------------------------:::::::HttpServerHttpServer:" + result.getResult()); while (result.getResult() == -11){ //System.out.println("百度人脸API"); //Log.e("HomeActivity", faceName + ":百度人脸API加载中"); Log.e("TAG01","百度人脸API加载中---》"); } //9.判断是否提取成功:128为成功,-1为参数为空,-2表示未检测到人脸 if (result.getResult() == -1) { Log.e("HomeActivity", faceName + ":bitmap参数为空"); System.out.println("bitmap参数为空------01");// Toast.makeText(HomeActivity.this, faceId+"-->"+faceName+" bitmap人脸图片参数为空",// Toast.LENGTH_SHORT).show(); //ToastUtils.toast(HomeActivity.this, faceId+"-->"+faceName+" bitmap人脸图片参数为空"); } else if (result.getResult() == -2) { Log.e("HomeActivity", faceName + ":未检测到人脸"); System.out.println("未检测到人脸------02");// Toast.makeText(HomeActivity.this, faceId+"-->"+faceName+" 未检测到人脸",// Toast.LENGTH_SHORT).show(); //ToastUtils.toast(HomeActivity.this, faceId+"-->"+faceName+" 未检测到人脸"); } else if (result.getResult() == -3) { Log.e("HomeActivity", faceName + ":抠图失败"); System.out.println("抠图失败------03");// Toast.makeText(HomeActivity.this, faceId+"-->"+faceName+" 人脸抠图失败",// Toast.LENGTH_SHORT).show(); //ToastUtils.toast(HomeActivity.this, faceId+"-->"+faceName+" 人脸抠图失败"); }else if(result.getResult() == -11){ }else if (result.getResult() == 128) { //10.图片特征提取成功,存入数据库 // 将用户信息保存到数据库中 Log.e("TAG01","保存人脸中---》"); boolean importDBSuccess = FaceApi.getInstance().registerUserIntoDBSelf(null,String.valueOf(faceId), faceName, faceName, bind_user_str, bytes); //System.out.println("------04:" + importDBSuccess); //11.保存数据库成功 if (importDBSuccess) { //12.保存图片到新目录中 File facePicDir = FileUtils.getBatchImportSuccessDirectory(); if (facePicDir != null) { File savePicPath = new File(facePicDir, faceName); if (FileUtils.saveBitmap(savePicPath, result.getBitmap())) { Log.i("HomeActivity", "图片保存成功"); System.out.println("图片保存成功------05:");// Toast.makeText(HomeActivity.this, faceId+"-->"+faceName+" 人脸图片保存失败",// Toast.LENGTH_SHORT).show(); success = true; } else { System.out.println("图片保存失败------06:"); Log.i("HomeActivity", "图片保存失败");// Toast.makeText(HomeActivity.this, faceId+"-->"+faceName+" 人脸图片保存失败",// Toast.LENGTH_SHORT).show(); //ToastUtils.toast(HomeActivity.this, faceId+"-->"+faceName+" 人脸图片保存失败"); } } } else { Log.e("HomeActivity", faceName + ":保存到数据库失败"); System.out.println("保存到数据库失败------07:");// Toast.makeText(HomeActivity.this, faceId+"-->"+faceName+" 保存到数据库失败",// Toast.LENGTH_SHORT).show(); //ToastUtils.toast(HomeActivity.this, faceId+"-->"+faceName+" 保存到数据库失败"); } }else { Log.e("HomeActivity", faceName + ":未检测到人脸"); System.out.println(faceName + ":未检测到人脸----08");// Toast.makeText(HomeActivity.this, faceId+"-->"+faceName+" 未检测到人脸",// Toast.LENGTH_SHORT).show(); //ToastUtils.toast(HomeActivity.this, faceId+"-->"+faceName+" 未检测到人脸"); } //12.图片回收 if (!faceImg.isRecycled()) { faceImg.recycle(); } //13.判断成功与否 if (success) { mSuccessCount++; //15.数据保存成功以后,这里告诉服务器已经同步好了图片----- faceIds.add(faceId+"_Ok"); Log.e("TAG01","人脸保存成功---》"+faceId+"_Ok"); } else { mFailCount++; //16.人脸没有入库成功,那么这里需要----- faceIds.add(faceId+"_Fail"); System.out.println(faceName + ":失败图片----09"); Log.e("HomeActivity", "失败图片:" + faceName); Log.e("TAG01","人脸保存失败---》");// Toast.makeText(HomeActivity.this, faceId+"-->"+faceName+" 同步失败",// Toast.LENGTH_SHORT).show(); //ToastUtils.toast(HomeActivity.this, faceId+"-->"+faceName+" 同步失败"); } //14.已经处理了多少张人脸了,做个统计 mFinishCount++; } } } //这里for循环结束,执行完以后,图片导入完成 //17.for循环完成所有人脸的导入,获取导入成功人脸的IDS StringBuilder idsStr = new StringBuilder(); if(faceIds.size()>0){ for (String faceId : faceIds) { idsStr.append(faceId).append(","); } if(idsStr.charAt(idsStr.length()-1) ==','){ idsStr.deleteCharAt(idsStr.length()-1); } //18.发送入库成功人脸Id,给服务器 Log.e("TAG01","人脸保存情况---idsStr》"+idsStr); sendSuccessFaceIdsLogin(idsStr); }else{// Toast.makeText(HomeActivity.this, "人脸数据,未同步成功或不需要同步",// Toast.LENGTH_SHORT).show(); ToastUtils.toast(HomeActivity.this, "人脸加载中,请稍等...."); Timer timer = new Timer(); TimerTask timerTask = new TimerTask() { @Override public void run() { uiHandler.sendEmptyMessage(151); ToastUtils.toast(HomeActivity.this, "人脸数据加载成功"); } }; timer.schedule(timerTask,2000); //ToastUtils.toast(HomeActivity.this, "人脸数据加载完成"); //ToastUtils.toast(HomeActivity.this, "本次没有同步成功的人脸或不需要同步"); //服务器发送过来的信息是空的时候会显示这个提升------ //System.out.println("本次没有同步成功的人脸或不需要同步"); } //ToastUtils.toast(HomeActivity.this, "人脸同步完成"); //初始化人脸库成功. } catch (JSONException e) { e.printStackTrace(); } catch (Exception e){ //HttpServer ---人脸同步出错了.. //Log.e("onResponse","1233"); //ToastUtils.toast(HomeActivity.this, "人脸数据同步异常"); e.printStackTrace(); throw e; } }
标签: #百度在线识别图片找原图