百度AI人脸检测——解析JSON 数据格式
1.了解一下
通常情况下,每个需要访问网络的应用程序都会有一个自己的服务器,我们可以向服务器提交数据,也可以从服务器上获取数据。不过这个时候就出现了一个问题,这些数据到底要以什么样的格式在网络上传输呢?
随便传递一段文本肯定是不行的,因为另一方根本就不会知道这段文本的用途是什么。因此,一般都会在网络上传输一些格式化后的数据,这种数据会有一定的结构规格和语义,当另一方收到数据消息之后就可以按照相同的结构规格进行解析,从而取出他想要的那部分内容。
在网络上传输数据时最常用的格式有两种:XML 和JSON。相比 XML,JSON的主要优势在于它的体积更小,在网络上传输的时候可以更省流量。因此,本节重点讲解JSON格式数据的解析。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它可以将JavaScript对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在需要的时候将它还原为各编程语言所支持的数据格式。··········JSON的建构主要有以下两种结构在;
(1)“名称/值"对的集合。不同的语言中,它被理解为对像(object).记录(record)、结构(struct)、字典(dictionary)、哈希表(hash table),有饥列表(keyed list)或者关联数组(association array)。
对象是一个无序的“名称/值"对的集合。一个对象以|“{”开始,以“}”结束。每个“名称”后跟一个“:”,多个“名称/值"之间使用“,”来分隔。例:
{" id":1,"name” : "zhangsan", "sex”:"M"","age":19}
(2)值的有序列表。在大部分语言中,它被理解为数组(array).
数组是值(value)的有序集会。一个数组以“[”开始,以“]”结束。值之间使用“,”分隔。例加,
[ { "id":1,"name" :"zhangsan", "sex":"M","age":19},
{"id":2,"nane": "lisi" , "sex" :"F" , "age":18},
{"id":3,"name" : "wangwu" , "sex": "M", "age":20} ]
2.如何解析
解析JSON格式的数据有很多种方法,可以使用官方提供的JSONObject,也可以使用Google的开源库GSON,还有一些第三方的开源库Jackson,FastJSON。
这里用FastJSON来解析百度AI返回的JSON格式数据。
首先在build.gradle下引入依赖:
implementation 'com.alibaba:fastjson:1.2.32'
现在我们看看什么是fastjson?
fastjson 是一个性能极好的用 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发。
主要特点:
- 快速FAST (比其它任何基于Java的解析器和生成器更快,包括jackson)
- 强大(支持普通JDK类包括任意Java Bean Class、Collection、Map、Date或enum)
- 零依赖(没有依赖其它任何类库除了JDK)
(1).生成Json
JavaBean,List<JavaBean>,List<String>,List<Map<String,Object>>
String jsonString = JSON.toJSONString(obj);
(2).解析Json
1.JavaBean
Class class= JSON.parseObject(jsonString, Class.class);
2.List<JavaBean>
List<Class> class="JSON".parseArray((jsonString, Class.class);
3.List<String>
List<String> listString = JSON.parseArray(jsonString, String.class);
4.List<Map<String,Object>>
List<Map<String, Object>> listMap = JSON.parseObject(jsonString, new TypeReference<List<Map<String,Object>>>(){});
这里我们选择JavaBean的方式解析。
先来看看百度AI返回的数据
注意我这里的map.put("face_field", "age,beauty,landmark");因为我不需要其他的,就只需要这三个。
将上面的数据排版一下:
现在可以清晰地看见这段数据的结构了,那我们怎么解析呢?
首先我们需要定义一个FaceDetectBean,用于将返回的JSON字符串转换为一个Java类对象。
public class FaceDetectBean {
public FaceDetectBean(){
}
public FaceDetectBean(int error_code, String error_msg, int log_id, int timestamp, int cached, ResultClass result) {
this.error_code = error_code;
this.error_msg = error_msg;
this.log_id = log_id;
this.timestamp = timestamp;
this.cached = cached;
this.result = result;
}
/**
"error_code":0,
"error_msg":"SUCCESS",
"log_id":2473751407,
"timestamp":1646563273,
"cached":0,
"result":{
*/
private int error_code;
private String error_msg;
private int log_id;
private int timestamp;
private int cached;
private ResultClass result;
public int getError_code() {
return error_code;
}
public void setError_code(int error_code) {
this.error_code = error_code;
}
public String getError_msg() {
return error_msg;
}
public void setError_msg(String error_msg) {
this.error_msg = error_msg;
}
public int getLog_id() {
return log_id;
}
public void setLog_id(int log_id) {
this.log_id = log_id;
}
public int getTimestamp() {
return timestamp;
}
public void setTimestamp(int timestamp) {
this.timestamp = timestamp;
}
public int getCached() {
return cached;
}
public void setCached(int cached) {
this.cached = cached;
}
public ResultClass getResult() {
return result;
}
public void setResult(ResultClass result) {
this.result = result;
}
}
对比一下:
是按照返回的内容写的FaceDetectBean的属性。
而最后的private ResultClass result; 是什么?
public class ResultClass {
/*
"face_num":1,
"face_list":[]
*/
private int face_num;
private List<face_list_bean> face_list;
public List<face_list_bean> getFace_list() {
return face_list;
}
public void setFace_list(List<face_list_bean> face_list) {
this.face_list = face_list;
}
public int getFace_num() {
return face_num;
}
public void setFace_num(int face_num) {
this.face_num = face_num;
}
}
对照一下:
那 List<face_list_bean>是什么呢?
public class face_list_bean{
/*
"face_token":"8ad51d2c97a022efa8ffb5f789fc9658",
"location":{
"left":99.57,
"top":112.13,
"width":258,
"height":230,
"rotation":-4 },
"face_probability":1,
"angle":{
"yaw":-4.94,
"pitch":22.63,
"roll":-6.86 },
"age":22,
"beauty":78.24,
"landmark":[
{"x":172.24,"y":148.64},
{"x":280.38,"y":140.28},
{"x":229.78,"y":222.21},
{"x":235.31,"y":264.27} ],
"landmark72":[{....}]
*/
private String face_token;
private locationbean location;
private int face_probability;
private anglebean angle;
private int age;
private double beauty;
private List<landmarkbean> landmark;
private List<landmark72bean> landmark72;
public String getFace_token() {
return face_token;
}
public void setFace_token(String face_token) {
this.face_token = face_token;
}
public locationbean getLocation() {
return location;
}
public void setLocation(locationbean location) {
this.location = location;
}
public int getFace_probability() {
return face_probability;
}
public void setFace_probability(int face_probability) {
this.face_probability = face_probability;
}
public anglebean getAngle() {
return angle;
}
public void setAngle(anglebean angle) {
this.angle = angle;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getBeauty() {
return beauty;
}
public void setBeauty(double beauty) {
this.beauty = beauty;
}
public List<landmarkbean> getLandmark() {
return landmark;
}
public void setLandmark(List<landmarkbean> landmark) {
this.landmark = landmark;
}
public List<landmark72bean> getLandmark72() {
return landmark72;
}
public void setLandmark72(List<landmark72bean> landmark72) {
this.landmark72 = landmark72;
}
}
接着,我们对照一下:
OK,locationbean,anglebean,List<landmarkbean>,List<landmark72bean>这些都是什么?
应该不用一一解释了吧,我把代码放上来。
public class locationbean {
/*
"location":{
"left":99.57,
"top":112.13,
"width":258,
"height":230,
"rotation":-4 },
*/
private double left;
private double top;
private double width;
private double height;
private double rotation;
public double getLeft() {
return left;
}
public void setLeft(double left) {
this.left = left;
}
public double getTop() {
return top;
}
public void setTop(double top) {
this.top = top;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getRotation() {
return rotation;
}
public void setRotation(double rotation) {
this.rotation = rotation;
}
}
public class anglebean {
/*
"angle":{
"yaw":-4.94,
"pitch":22.63,
"roll":-6.86 },
*/
private double yaw;
private double pitch;
private double roll;
public double getYaw() {
return yaw;
}
public void setYaw(double yaw) {
this.yaw = yaw;
}
public double getPitch() {
return pitch;
}
public void setPitch(double pitch) {
this.pitch = pitch;
}
public double getRoll() {
return roll;
}
public void setRoll(double roll) {
this.roll = roll;
}
}
public class landmarkbean{
/*
"landmark":[
{"x":172.24,"y":148.64},
{"x":280.38,"y":140.28},
{"x":229.78,"y":222.21},
{"x":235.31,"y":264.27} ],
*/
private double x;
private double y;
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
}
List<landmarkbean>和List<landmark72bean>内容一致。
至此,FaceDetectBean才算写完,这样我们的数据转为Java对象时,才能一一对应。
回到正题,我们开始对JSON格式的数据进行解析。
//解析JSON格式数据
JSON json = JSON.parseObject(result); //result为百度AI返回的JSON格式数据
FaceDetectBean faceDetectBean = JSON.toJavaObject(json,FaceDetectBean.class); //将result转为FaceDetectBean的对象,这样我们就可以对数据进行操作了。
ResultClass resultClass =faceDetectBean.getResult(); //通过getResult()获取到ResultClass的对象
List<face_list_bean> face_list = resultClass.getFace_list(); //通过getFace_list()获取到List<face_list_bean>的对象,我们需要的东西都放在这里面。
for(int i=0;i<face_list.size();i++){ //从图片上的第一张人脸开始
face_list_bean myface = face_list.get(i); //得到该人脸的face_list_bean对象
List<landmark72bean> landmark72beanList = myface.getLandmark72();
landmark72bean landmark72_left = landmark72beanList.get(17);
landmark72bean landmark72_right = landmark72beanList.get(30);
System.out.println("x="+landmark72_left.getX()+", y="+landmark72_left.getY());
System.out.println("x="+landmark72_right.getX()+", y="+landmark72_right.getY());
left_x = landmark72_left.getX();
left_y = landmark72_left.getY();
right_x = landmark72_right.getX();
right_y = landmark72_right.getY();
double dx = (left_x - right_x);
double dy = (left_y - right_y);
distance = Math.sqrt(dx*dx + dy*dy );
System.out.println("distance===>"+distance);
}
因为我需要的是landmark里人脸关键点的坐标,所以一直获取到 landmark的对象才可以。
如果只需要age,beauty则得到face_list_bean的对象就可以了。通过 对象.getAge()方法就能得到年龄。
总之,需要什么信息,就看看该信息是哪个类的属性。通过创建该类的对象,对象的get,set方法对数据进行操作。
----------------------
源码:https://github.com/Xiang-MY/BDALdemo
百度AI人脸检测——解析JSON 数据格式的更多相关文章
- 基于百度AI人脸识别技术的Demo
编写demo之前首先浏览官方API:http://ai.baidu.com/docs#/Face-API/top 下面是源码: package com.examsafety.test; import ...
- C语言cJSON库的使用,解析json数据格式
C语言cJSON库的使用,解析json数据格式 摘自:https://www.cnblogs.com/piaoyang/p/9274925.html 对于c语言来说是没有字典这样的结构的,所以对于解析 ...
- 百度AI—人脸在线比对
首先访问百度AI网站:https://cloud.baidu.com/,按照下图的指示点开到应用管理的页面. 穿件完成之后到管理中可以查看到对应的 添加工具类: using System; using ...
- 百度AI人脸识别的学习总结
本文主要分以下几个模块进行总结分析 项目要求:运用百度AI(人脸识别)通过本地与外网之间的信息交互(MQService),从而通过刷脸实现登陆.签字.会议签到等: 1.准备工作: 内网:单击事件按钮— ...
- android 解析json数据格式(转)
json数据格式解析我自己分为两种: 一种是普通的,一种是带有数组形式的: 普通形式的:服务器端返回的json数据格式如下: {"userbean":{"Uid" ...
- android 解析json数据格式
json数据格式解析我自己分为两种: 一种是普通的,一种是带有数组形式的: 普通形式的:服务器端返回的json数据格式如下: {"userbean":{"Uid" ...
- <转>android 解析json数据格式
json数据格式解析我自己分为两种:一种是普通的,一种是带有数组形式的: 普通形式的:服务器端返回的json数据格式如下:{"userbean":{"Uid": ...
- android之解析json数据格式详解
1.JSON解析 (1).解析Object之一: view sourceprint? 1 {"url":"http://www.cnblogs.com/qianx ...
- 基于C# 调用百度AI 人脸识别
一.设置 登录百度云控制台,添加应用-添加人脸识别,查找,对比等. 记住API Key和Secret Key 二.创建Demo程序 1.使用Nuget安装 Baidu.AI 和 Newtonsoft. ...
随机推荐
- luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp)
luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp) Luogu 题外话: 我可能是傻逼, 但不管我是不是傻逼, 我永远单挑出题人. 题解时间 看数据范围可以确定状压dp. ...
- 垃圾收集器G1和CMS ,以及老年代和新生代的比例设置
首先 1.G1是包括年轻代和年老代的GC 2.CMS是年老代GC 3.二者在某些时候都需要FullGC(serial old GC)的辅助 ###CMS收集器:CMS(ConCurrent Mark ...
- linux安装maven环境
linux安装maven环境 一. 下载压缩包: 官网地址: http://maven.apache.org/download.cgi 或者百度网盘链接:https://pan.baidu.com/s ...
- 文件下载文件名包含中文时,乱码的处理方法(url编解码)
utf-8/gbk编码 "中"这个汉子的utf-8编码为:E4B8AD gbk编码为:D6D0 urlencode 经过urlencode编码后, %E4%B8%AD %D6%D0 ...
- spring 提供了哪些配置方式?
基于 xml 配置 bean 所需的依赖项和服务在 XML 格式的配置文件中指定.这些配置文件通常 包含许多 bean 定义和特定于应用程序的配置选项.它们通常以 bean 标签开 头. 例如: &l ...
- 企业流程再造(BPR)--系统重构
企业流程再造(BPR) 企业流程:指生产或服务过程中一连串活动的工作流程 企业流程再造:对企业流程所进行的根本性的在思考和彻底的再设计,以使企业的速度,质量,服务和成本等关键业绩指标获得根本性的改善
- ROS的安装-> rosdep init /update报错2022.02.24实测有效
ROS的安装-> rosdep init /update报错2022.02.24实测有效 一. 解决rosdep_init问题 正常执行sudo rosdep init会报错,如下: ERR ...
- MTK平台电路设计01
一.资料 获取途径MTK官网.一牛网 二.
- 6_稳定性_李雅普诺夫_Lyapunov
李雅普诺夫方法参考
- carsim的一些注意事项
1.carsim导入simulink中运行的目录下最好有simfile.sim文件,可以再carsim_2016.1_date中找到(文件夹内最下端) 2.carsim导入simulink中如果显示下 ...