在使用百度的AI开放平台时,不熟悉网页请求这类知识,遇到使用不畅的问题,借鉴了网上两个人的经验,最后实现了更直白的代码。
主程序:
'''
# 人体关键点识别
'''
import base64
import urllib
import urllib.request,sys,base64
import urllib.parse
import json
import joint
import cv2
request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_analysis"
#使用不同的功能时在百度的相应说明文档处替换此处
f = open('/home/zhengr/Documents/data/1.jpg', 'rb')
image = base64.b64encode(f.read())
image64 = str(image,'utf-8')
image_type = "BASE64"
params = {'image': image64,'image_type':"BASE64"}
params = urllib.parse.urlencode(params).encode("utf-8")
access_token = '[24.fdd8df19e52da8ff449e1484aa582f42.2592000.1556250057.282335-15823849]'
request_url = request_url + "?access_token=" + access_token
#access token是每个人获得的,有效期30天?貌似
request = urllib.request.urlopen(url=request_url, data=params) # 发送请求
content = request.read() # 将返回结果读取出来
print(content) # 显示返回结果
result = str(content,'utf-8')
res = json.loads(result)
print(res['person_info'][0]['body_parts'])
ress = res['person_info'][0]['body_parts']
jo = (ress)
jo.xunhun('/home/zhengr/Documents/data/1.jpg')
直接用python执行该程序就可以获得关键点识别结果,access token获得需要的代码:
#!/bin/bash curl -i -k 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=QMLVBU3QbNA25XxawltynC1R&client_secret=GuwC9U5WTIbvWgo7ryolIB6Yy1e5H5Nx'
其中的client_id和client_secret分别是注册百度平台时获得的API Key和Secret Key。执行以上文件,得到"access_token":"24.fdd8df19e52da8ff449e1484aa582f42.2592000.1556250057.282335-15823849"格式的即为自己的access token。以上代码中的joint.Joint()是网上的,其代码如下:
import cv2
import os
class Joint(object):
__circle_list = []
def __init__(self,dic):
self.dic = dic
def draw_line(self,img):
#nose ---> neck
cv2.line(img, (int(self.dic['nose']['x']),int(self.dic['nose']['y'])),
(int(self.dic['neck']['x']),int(self.dic['neck']['y'])), (0,255,0), 2)
#neck --> left_shoulder
cv2.line(img, (int(self.dic['neck']['x']),int(self.dic['neck']['y'])),
(int(self.dic['left_shoulder']['x']),int(self.dic['left_shoulder']['y'])), (0,255,0), 2)
#neck --> right_shoulder
cv2.line(img, (int(self.dic['neck']['x']),int(self.dic['neck']['y'])),
(int(self.dic['right_shoulder']['x']),int(self.dic['right_shoulder']['y'])), (0,255,0), 2)
#left_shoulder --> left_elbow
cv2.line(img, (int(self.dic['left_shoulder']['x']),int(self.dic['left_shoulder']['y'])),
(int(self.dic['left_elbow']['x']),int(self.dic['left_elbow']['y'])), (0,255,0), 2)
#left_elbow --> left_wrist
cv2.line(img, (int(self.dic['left_elbow']['x']),int(self.dic['left_elbow']['y'])),
(int(self.dic['left_wrist']['x']),int(self.dic['left_wrist']['y'])), (0,255,0), 2)
#right_shoulder --> right_elbow
cv2.line(img, (int(self.dic['right_shoulder']['x']),int(self.dic['right_shoulder']['y'])),
(int(self.dic['right_elbow']['x']),int(self.dic['right_elbow']['y'])), (0,255,0), 2)
#right_elbow --> right_wrist
cv2.line(img, (int(self.dic['right_elbow']['x']),int(self.dic['right_elbow']['y'])),
(int(self.dic['right_wrist']['x']),int(self.dic['right_wrist']['y'])), (0,255,0), 2)
#neck --> left_hip
cv2.line(img, (int(self.dic['neck']['x']),int(self.dic['neck']['y'])),
(int(self.dic['left_hip']['x']),int(self.dic['left_hip']['y'])), (0,255,0), 2)
#neck --> right_hip
cv2.line(img, (int(self.dic['neck']['x']),int(self.dic['neck']['y'])),
(int(self.dic['right_hip']['x']),int(self.dic['right_hip']['y'])), (0,255,0), 2)
#left_hip --> left_knee
cv2.line(img, (int(self.dic['left_hip']['x']),int(self.dic['left_hip']['y'])),
(int(self.dic['left_knee']['x']),int(self.dic['left_knee']['y'])), (0,255,0), 2)
#right_hip --> right_knee
cv2.line(img, (int(self.dic['right_hip']['x']),int(self.dic['right_hip']['y'])),
(int(self.dic['right_knee']['x']),int(self.dic['right_knee']['y'])), (0,255,0), 2)
#left_knee --> left_ankle
cv2.line(img, (int(self.dic['left_knee']['x']),int(self.dic['left_knee']['y'])),
(int(self.dic['left_ankle']['x']),int(self.dic['left_ankle']['y'])), (0,255,0), 2)
#right_knee --> right_ankle
cv2.line(img, (int(self.dic['right_knee']['x']),int(self.dic['right_knee']['y'])),
(int(self.dic['right_ankle']['x']),int(self.dic['right_ankle']['y'])), (0,255,0), 2)
def xunhun(self,img):
im1 = cv2.imread(img,cv2.IMREAD_COLOR)
#im2 = cv2.resize(im1, (1040,768), interpolation=cv2.INTER_CUBIC)
for i in self.dic:
cv2.circle(im1,(int(self.dic[i]['x']),int(self.dic[i]['y'])),5,(0,255,0),-1)
self.draw_line(im1)
cv2.imshow('image',im1)
cv2.waitKey(0)
使用这个代码,会有不准的时候,试了几张图片都会出现,有部分关键点的坐标是(0,0),这种在返回值里有不正确、正确的关键点问题,应该不是我能解决的,所以就没有再追究了。
如有不对的地方,欢迎批评指正,如有侵权,请联系我删除。