上篇文章,我们把自己的程序接入了微信公众号,并且能把用户发送的文本及图片文件原样返回。今天我们把用户的图片通过腾讯的AI平台分析后再返回给用户。
效果图
我们先看一下官方人脸检测与分析接口的描述:
检测给定图片(Image)中的所有人脸(Face)的位置和相应的面部属性。位置包括(x, y, w, h),面部属性包括性别(gender), 年龄(age), 表情(expression), 魅力(beauty), 眼镜(glass)和姿态(pitch,roll,yaw)。
请求参数包括下面几个:
- app_id 应用标识,我们在AI平台注册后就可以得到
- app_id time_stamp 时间戳
- nonce_str 随机字符串
- sign签名信息,需要我们自己去计算
- image 需要检测的图片(上限1M)
- mode 检测模式
1.接口鉴权,构造请求参数 官方给了我们接口鉴权的计算方法。
将请求参数对按key进行字典升序排序,得到有序的参数对列表N 将列表N中的参数对按URL键值对的格式拼接成字符串,得到字符串T(如:key1=value1&key2=value2),URL键值拼接过程value部分需要URL编码,URL编码算法用大写字母,例如%E8,而不是小写%e8 将应用密钥以app_key为键名,组成URL键值拼接到字符串T末尾,得到字符串S(如:key1=value1&key2=value2&app_key=密钥) 对字符串S进行MD5运算,将得到的MD5值所有字符转换成大写,得到接口请求签名 2.请求接口地址 请求接口信息,我们用 requests 发送请求,会得到返回的 json 格式的图像信息pip install requests安装requests。
3.处理返回的信息 处理返回的信息,把信息展示在图片上,再把处理后的图片保存。这里我们用到 opencv ,和 pillow 两个库pip install pillow和pip install opencv-python来安装。
开始编写代码,我们新建一个face_id.py 文件来对接AI平台,并且返回检测后的图像数据。
import time
import random
import base64
import hashlib
import requests
from urllib.parse import urlencode
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
import os
'''
遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!
'''
# 一.计算接口鉴权,构造请求参数
def random_str():
'''得到随机字符串nonce_str'''
str = 'abcdefghijklmnopqrstuvwxyz'
r = ''
for i in range(15):
index = random.randint(0,25)
r += str[index]
return r
def image(name):
with open(name, 'rb') as f:
content = f.read()
return base64.b64encode(content)
def get_params(img):
'''组织接口请求的参数形式,并且计算sign接口鉴权信息,
最终返回接口请求所需要的参数字典'''
params = {
'app_id': '1106860829',
'time_stamp': str(int(time.time())),
'nonce_str': random_str(),
'image': img,
'mode': '0'
}
sort_dict = sorted(params.items(), key=lambda item: item[0], reverse=False) # 排序
sort_dict.append(('app_key', 'P8Gt8nxi6k8vLKbS')) # 添加app_key
rawtext = urlencode(sort_dict).encode() # URL编码
sha = hashlib.md5()
sha.update(rawtext)
md5text = sha.hexdigest().upper() # 计算出sign,接口鉴权
params['sign'] = md5text # 添加到请求参数列表中
return params
# 二.请求接口URL
def access_api(img):
print(img)
frame = cv2.imread(img)
nparry_encode = cv2.imencode('.jpg', frame)[1]
data_encode = np.array(nparry_encode)
img_encode = base64.b64encode(data_encode) # 图片转为base64编码格式
url = 'https://api.ai.qq.com/fcgi-bin/face/face_detectface'
res = requests.post(url, get_params(img_encode)).json() # 请求URL,得到json信息
# 把信息显示到图片上
if res['ret'] == 0: # 0代表请求成功
pil_img = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) # 把opencv格式转换为PIL格式,方便写汉字
draw = ImageDraw.Draw(pil_img)
for obj in res['data']['face_list']:
img_width = res['data']['image_width'] # 图像宽度
img_height = res['data']['image_height'] # 图像高度
# print(obj)
x = obj['x'] # 人脸框左上角x坐标
y = obj['y'] # 人脸框左上角y坐标
w = obj['width'] # 人脸框宽度
h = obj['height'] # 人脸框高度
# 根据返回的值,自定义一下显示的文字内容
if obj['glass'] == 1: # 眼镜
glass = '有'
else:
glass = '无'
if obj['gender'] >= 70: # 性别值从0-100表示从女性到男性
gender = '男'
elif 50
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?