前言
正好我的作业需要做行人识别这件事,需要识别是人的朝向,网上搜索了解到腾讯云有现成的人体分析的接口,于是就结合百度和API文档,简单实现了功能,写这篇文章是为了记录一下这个功能以及实现,可能以后会用到。
过程分析
先上连接大家看一下腾讯的产品
腾讯云的人体分析网址
1.工具
腾讯云的API需要调用的是网上的图片,返回的结果是一串稍微复杂的信息(包括标识出人的框框,还有人的朝向等等)。我们只需要对这串返回的信息进行提取,提取出XY坐标就可以用python的画图工具框出图片上的人。
2.问题
python要画图只能对本地文件画图,而腾讯云的人体分析API需要的是线上的图片(即链接),所以这里我就把线上的图片下载下来放在本地,然后python就可以画图了,所以其实是同一张图。
解决办法:可以先找好图,然后调用腾讯云的对象存储接口将图片保存在云端,同时这个接口提供获取云端图片连接的函数,调用函数获取所有图片链接,这样人体分析的API就可以用了,而PYTHON可以用本地的文件画图就可以了。(可以参照我上一篇文章,把图片上传到对象存储的桶里)
3.步骤总结:
调用腾讯云人体分析API->对返回的数据进行处理并存储->用Python的第三方库画图,框出行人。
代码实现
python代码:
这个官方的调式里有,我这里加了python画图的代码,我只实现了一张照片的读取和框人,毕竟我刚学不久,大家见谅。
import json
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.bda.v20200324 import bda_client, models
from PIL import ImageDraw, Image
try:
cred = credential.Credential("你的SecretId", "你的SecretKey")
httpProfile = HttpProfile()
httpProfile.endpoint = "bda.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
client = bda_client.BdaClient(cred, "你的接入地", clientProfile)
req = models.DetectBodyRequest()
params = {
"AttributesOptions": {
"Orientation": True
},
"MaxBodyNum": 10,
"Url": "图片地址"
}
req.from_json_string(json.dumps(params))
#resp就是返回的数据
resp = client.DetectBody(req)
#用print函数看一下返回数据的数据结构
print(resp.to_json_string())
except TencentCloudSDKException as err:
print(err)
#下面的代码是对返回的数据进行分析和框人
img = Image.open('本地图片地址')
img.show()
draw = ImageDraw.Draw(img)
#下面就要从腾讯云API返回的信息中获取坐标的代码
for i in json.loads(resp.to_json_string())["BodyDetectResults"]:
print(i)
location = []#记录坐标
for j in i["BodyRect"].values():
location.append(j)
#看一下坐标信息
print(location)
x1,y1,x2,y2=location[0],location[1],location[0]+location[2],location[1]+location[3];
draw.rectangle([x1, y1, x2, y2], outline=(128, 0, 128), width=2)
img.show() #显示
img.save('保存图片地址+名')