作者:wangwei8638
手势识别应用于智能家电、家用机器人、可穿戴、儿童教具等硬件设备,通过用户的手势控制对应的功能,人机交互方式更加智能化、自然化。本文主要介绍手势识别API的调用使用攻略。
一.平台接入
此步骤比较简单,不多阐述。可参照之前文档:
https://ai.baidu.com/forum/topic/show/943028
二.分析接口文档
https://ai.baidu.com/docs#/Body-API/02f6ce24
(1)接口描述
识别图片中的手势类型,返回手势名称、手势矩形框、概率分数,可识别24种常见手势,适用于手势特效、智能家居手势交互等场景。
支持的24类手势列表:拳头、OK、祈祷、作揖、作别、单手比心、点赞、Diss、我爱你、掌心向上、双手比心(3种)、数字(9种)、Rock、竖中指。
除识别手势外,若图像中检测到人脸,会同时返回人脸框位置。
(2)请求说明
需要用到的信息有:
请求URL:
https://aip.baidubce.com/rest/2.0/image-classify/v1/gesture
Header格式:Content-Type:application/x-www-form-urlencoded
(3)返回示例
{
"log_id": 4466502370458351471,
"result_num": 2,
"result": [{
"probability": 0.9844077229499817,
"top": 20,
"height": 156,
"classname": "Face",
"width": 116,
"left": 173
},
{
"probability": 0.4679304957389832,
"top": 157,
"height": 106,
"classname": "Heart_2",
"width": 177,
"left": 183
}]
}
2.获取access_token
#client_id 为官网获取的AK, client_secret 为官网获取的SK
client_id =【百度云应用的AK】
client_secret =【百度云应用的SK】
#获取token
def get_token():
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + client_id + '&client_secret=' + client_secret
request = urllib.request.Request(host)
request.add_header('Content-Type', 'application/json; charset=UTF-8')
response = urllib.request.urlopen(request)
token_content = response.read()
if token_content:
token_info = json.loads(token_content.decode("utf-8"))
token_key = token_info['access_token']
return token_key
{'log_id': 288214665005727209,
'result': [{'classname': 'Five',
'height': 253,
'left': 537,
'probability': 0.8713970184326172,
'top': 344,
'width': 238},
{'classname': 'Face',
'height': 237,
'left': 808,
'probability': 0.7121545076370239,
'top': 164,
'width': 208}],
'result_num': 2}
处理结果方面:可以看出,检测出手势为Five,以及识别人脸并标出位置。
处理速度方面:处理时间4.80s,时间较长。
四.源码共享
# -*- coding: utf-8 -*-
#!/usr/bin/env python
import os
import requests
import base64
import json
from pprint import pprint
import time
#client_id 为官网获取的AK, client_secret 为官网获取的SK
api_key = '**************************'
secret_key = '******************************'
class LandmarkRecognizer(object):
def __init__(self, api_key, secret_key):
self.access_token = self._get_access_token(api_key=api_key, secret_key=secret_key)
self.API_URL = 'https://aip.baidubce.com/rest/2.0/image-classify/v1/gesture' + '?access_token=' \
+ self.access_token
#获取token
@staticmethod
def _get_access_token(api_key, secret_key):
api = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials' \
'&client_id={}&client_secret={}'.format(api_key, secret_key)
rp = requests.post(api)
if rp.ok:
rp_json = rp.json()
# print(rp_json['access_token'])
return rp_json['access_token']
else:
print('=> Error in get access token!')
def get_result(self, params):
rp = requests.post(self.API_URL, data=params)
if rp.ok:
# print('=> Success! got result: ')
rp_json = rp.json()
pprint(rp_json)
return rp_json
else:
print('=> Error! token invalid or network error!')
print(rp.content)
return None
#手势识别
def detect(self, img_path):
f = open(img_path, 'rb')
strover = '识别结果:'
img_str = base64.b64encode(f.read())
params = {'image': img_str}
tic = time.clock()
rp_json = self.get_result(params)
toc = time.clock()
print(strover)
print('花费时长: '+'%.2f' %(toc - tic) +' s')
if __name__ == '__main__':
recognizer = LandmarkRecognizer(api_key, secret_key)
img = 'F:\paddle\ss5.png'
recognizer.detect(img)