Java 百度AI 写一个简单的手势识别程序

教程地址:请关注我的https://edu.csdn.net/course/detail/23001

Java写一个简单的手势识别程序,这里采用百度是AI,视觉技术中的人体分析中的手势识别,识别图片中的手势类型,返回手势名称、手势矩形框、概率分数,可识别24种手势,支持动态手势识别,适用于手势特效、智能家居手势交互等场景;支持的手势列表:拳头、OK、祈祷、作揖、作别、单手比心、点赞、diss、我爱你、rock、掌心向上、竖中指、双手比心(3种)、数字(9种);

请求URL数据格式

向API服务地址使用POST发送请求,必须在URL中带上参数:

access_token:必须参数,参考“Access Token获取”。

注意:access_token的有效期为30天,切记需要每30天进行定期更换,或者每次请求都拉取新token。

  • 手势识别接口示例代码-(JavaAPI)
import java.net.URLEncoder;
import com.alibaba.fastjson.JSON;
import com.xs.body.bean.GestureBean;
import com.xs.util.baidu.Base64Util;
import com.xs.util.baidu.FileUtil;
import com.xs.util.baidu.HttpUtil;
/**
 * 手势识别Java-API调用示例代码
 * Base64Util、FileUtil、HttpUtil工具类下载地址
 * http://aixiaoshuai.mydoc.io/?t=234826
 * @author 小帅丶
 */
public class GestureAPISample {
	 public static String GESTURE_URL = "https://aip.baidubce.com/rest/2.0/image-classify/v1/gesture";
		public static void main(String[] args) throws Exception {
		//返回字符串
//		String result = getGestureResult("G:/gesture/摇滚.jpg", "自己的token");
//		System.out.println(result);
		//返回java对象
		GestureBean gestureBean = getGestureBean("G:/ht.jpg", "自己的token");
		System.out.println("识别个数:"+gestureBean.getResult_num());
		String gestureName = "";
		for (int i = 0; i < gestureBean.getResult().size(); i++) {
			if(gestureBean.getResult().get(i).getClassname().equals("Face")){
				System.out.println("此图中识别出人脸");
			}else{
				gestureName += GestureClassNameWorkBook.getGestureName(gestureBean.getResult().get(i).getClassname())+",";
			}
		}
		System.out.println("识别的手势:"+gestureName.substring(0, gestureName.length()-1));
	}
 /**
 * 识别图片中的手势类型,返回手势名称、手势矩形框、概率分数,可识别15种手势,支持动态手势识别,适用于手势特效、智能家居手势交互等场景;
 * 支持的15类手势列表:手指、掌心向前、拳头、OK、祈祷、作揖、作别、单手比心、点赞、diss、rock、掌心向上、双手比心(3种)。
 * @param imagePath 图片本地路径
 * @param accessToken 应用AccessToken
 * @return String
 * @throws Exception
 */
	private static String getGestureResult(String imagePath, String accessToken) throws Exception {
		byte[] imgData = FileUtil.readFileByBytes(imagePath);
 String imgStr = Base64Util.encode(imgData);
		String param = "image=" + URLEncoder.encode(imgStr,"UTF-8");
 // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
		String result = HttpUtil.post(GESTURE_URL, accessToken, param);
 return result;
	}
 /**
 * 识别图片中的手势类型,返回手势名称、手势矩形框、概率分数,可识别15种手势,支持动态手势识别,适用于手势特效、智能家居手势交互等场景;
 * 支持的15类手势列表:手指、掌心向前、拳头、OK、祈祷、作揖、作别、单手比心、点赞、diss、rock、掌心向上、双手比心(3种)。
 * @param imagePath 图片本地路径
 * @param accessToken 应用AccessToken
 * @return GestureBean
 * @throws Exception
 */
	private static GestureBean getGestureBean(String imagePath, String accessToken) throws Exception {
		byte[] imgData = FileUtil.readFileByBytes(imagePath);
 String imgStr = Base64Util.encode(imgData);
		String param = "image=" + URLEncoder.encode(imgStr,"UTF-8");
 // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
		String result = HttpUtil.post(GESTURE_URL, accessToken, param);
		GestureBean gestureBean = JSON.parseObject(result,GestureBean.class);
 return gestureBean;
	}
}
  • 处理后返回的内容
识别个数:2
识别的手势:拳头,掌心向前
  • 识别返回的JSON数据 可以看到识别出2个手势 一个为Fist 另一个为Palm
{
 "log_id": 3773186178434508300, 
 "result_num": 2, 
 "result": [
 {
 "probability": 0.9931142926216125, 
 "top": 153, 
 "height": 299, 
 "classname": "Fist", 
 "width": 269, 
 "left": 499
 }, 
 {
 "probability": 0.9748011231422424, 
 "top": 44, 
 "height": 455, 
 "classname": "Palm", 
 "width": 423, 
 "left": 86
 }
 ]
}
  • 需要用到的GestureBean
import java.util.List;
/**
 * 手势Bean 省略set/get
 * @author 小帅丶
 */
public class GestureBean {
	//手势数目
 private int result_num;
 //检测到的目标,手势、人脸
 private List<Result> result;
 //唯一的log id,用于问题定位
 private long log_id;
	/**
 * classname	目标所属类别,15种手势、other、face
 * top	目标框上坐标
 * widt	目标框的宽
 * left	目标框最左坐标
 * height	目标框的高
 * probability	目标属于该类别的概率
 * @author 小帅丶
 */
 public static class Result{
 	private double probability;
 	private int top;
 	private int height;
 	private String classname;
 	private int width;
 	private int left;
 }
}
  • classname转中文常量代码
package com.xs.body;
/**
 * 手势中文说明
 * @author 小帅丶
 *
 */
public class GestureClassNameWorkBook {
	/**
	 * 根据classname返回中文对应的名称
	 * @param classname 手势所属类别,15种手势、other、face
	 * @return String
	 * @throws Exception
	 */
	public static String getGestureName(String classname) throws Exception {
		String gestureName ="";
		if(classname.equals("Thumb_down")){
			gestureName="踩|拇指向下";
			return gestureName;
		}else if (classname.equals("Ok")) {
			gestureName="OK";
			return gestureName;
		}else if (classname.equals("ILY")) {
			gestureName="Rock";
			return gestureName;
		}else if (classname.equals("Heart_single")) {
			gestureName="单手比心";
			return gestureName;
		}else if (classname.equals("Thumb_up")) {
			gestureName="点赞|拇指向上";
			return gestureName;
		}else if (classname.equals("Prayer")) {
			gestureName="祈祷";
			return gestureName;
		}else if (classname.equals("Fist")) {
			gestureName="拳头";
			return gestureName;
		}else if (classname.equals("Point")) {
			gestureName="点|食指";
			return gestureName;
		}else if (classname.equals("Heart_1")||classname.equals("Heart_2")||classname.equals("Heart_3")) {
			gestureName="双手比心";
			return gestureName;
		}else if (classname.equals("Palm")) {
			gestureName="掌心向前";
			return gestureName;
		}else if (classname.equals("Palm_up")) {
			gestureName="掌心向上";
			return gestureName;
		}else if (classname.equals("Honour")) {
			gestureName="作别|告别";
			return gestureName;
		}else if (classname.equals("Rock")) {
			gestureName="摇滚";
			return gestureName;
		}else if (classname.equals("Congratulation")) {
			gestureName="作揖|祝贺";
			return gestureName;
		}else{
			gestureName ="未能匹配的手势:"+classname;
		 return gestureName;
		}
	}
}
  • 需要用到的第三方的Jar
fastjson json

获取access_token示例代码:

package com.baidu.ai.aip.auth;

import org.json.JSONObject;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;

import java.util.List;

import java.util.Map;

/**

* 获取token类

*/

public class AuthService {

/**

* 获取权限token

* @return 返回示例:

* {

* "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",

* "expires_in": 2592000

* }

*/

public static String getAuth() {

// 官网获取的 API Key 更新为你注册的

String clientId = "百度云应用的AK";

// 官网获取的 Secret Key 更新为你注册的

String clientSecret = "百度云应用的SK";

return getAuth(clientId, clientSecret);

}

/**

* 获取API访问token

* 该token有一定的有效期,需要自行管理,当失效时需重新获取.

* @param ak - 百度云官网获取的 API Key

* @param sk - 百度云官网获取的 Securet Key

* @return assess_token 示例:

* "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"

*/

public static String getAuth(String ak, String sk) {

// 获取token地址

String authHost = "https://aip.baidubce.com/oauth/2.0/token?";

String getAccessTokenUrl = authHost

// 1. grant_type为固定参数

+ "grant_type=client_credentials"

// 2. 官网获取的 API Key

+ "&client_id=" + ak

// 3. 官网获取的 Secret Key

+ "&client_secret=" + sk;

try {

URL realUrl = new URL(getAccessTokenUrl);

// 打开和URL之间的连接

HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();

connection.setRequestMethod("GET");

connection.connect();

// 获取所有响应头字段

Map<String, List<String>> map = connection.getHeaderFields();

// 遍历所有的响应头字段

for (String key : map.keySet()) {

System.err.println(key + "--->" + map.get(key));

}

// 定义 BufferedReader输入流来读取URL的响应

BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));

String result = "";

String line;

while ((line = in.readLine()) != null) {

result += line;

}

/**

* 返回结果示例

*/

System.err.println("result:" + result);

JSONObject jsonObject = new JSONObject(result);

String access_token = jsonObject.getString("access_token");

return access_token;

} catch (Exception e) {

System.err.printf("获取token失败!");

e.printStackTrace(System.err);

}

return null;

}

}

展开阅读全文

没有更多推荐了,返回首页