Python调⽤图像融合API
Python 调⽤图像融合API
本⽂记录使⽤Python,调⽤腾讯AI开放平台的图像融合API。官⽹给出的Demo⽤的是PHP,博主作为Python的粉丝,⾃然想⽤它来和『最好的』的语⾔⼀较⾼下,顺便加深对服务调⽤的理解
官⽹PHP实现
腾讯的应该写的⾮常详细了,可以直接运⾏的PHP代码如下:
<?php
// getReqSign :根据接⼝请求参数和应⽤密钥计算请求签名
// 参数说明
//  - $params:接⼝请求参数(特别注意:不同的接⼝,参数对⼀般不⼀样,请以具体接⼝要求为准)
//  - $appkey:应⽤密钥
// 返回数据
//  - 签名结果
function getReqSign($params /* 关联数组 */, $appkey /* 字符串*/)
{
// 1. 字典升序排序
ksort($params);
// 2. 拼按URL键值对
$str = '';
foreach ($params as $key => $value)
{
if ($value !== '')
{
$str .= $key . '=' . urlencode($value) . '&';
}
}
// 3. 拼接app_key
$str .= 'app_key=' . $appkey;
// 4. MD5运算+转换⼤写,得到请求签名
$sign = strtoupper(md5($str));
return $sign;
}
// doHttpPost :执⾏POST请求,并取回响应结果
// 参数说明
/
/  - $url  :接⼝请求地址
//  - $params:完整接⼝请求参数(特别注意:不同的接⼝,参数对⼀般不⼀样,请以具体接⼝要求为准)
// 返回数据
//  - 返回false表⽰失败,否则表⽰API成功返回的HTTP BODY部分
function doHttpPost($url, $params)
{
$curl = curl_init();
$response = false;
do
{
// 1. 设置HTTP URL (API地址)
curl_setopt($curl, CURLOPT_URL, $url);
// 2. 设置HTTP HEADER (表单POST)
$head = array(
'Content-Type: application/x-www-form-urlencoded'
);
curl_setopt($curl, CURLOPT_HTTPHEADER, $head);
// 3. 设置HTTP BODY (URL键值对)
$body = http_build_query($params);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
// 4. 调⽤API,获取响应结果
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_NOBODY, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($curl);
if ($response === false)
{
$response = false;
break;
}
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($code != 200)
{
$response = false;
break;
}
} while (0);
curl_close($curl);
return $response;
}
// 图⽚base64编码
$path  = 'test.jpg';
$data  = file_get_contents($path);
$base64 = base64_encode($data);
// 设置请求数据
$appkey = 'your_appkey';
$params = array(
'app_id'    => 'your_app_id',
'image'      => $base64,
'model'      => '1',
'time_stamp' => strval(time()),
'nonce_str'  => strval(rand()),
'sign'      => '',
);
$params['sign'] = getReqSign($params, $appkey);
// 执⾏API调⽤
$url = 'api.ai.qq/fcgi-bin/ptu/ptu_facemerge';
$response = doHttpPost($url, $params);
echo $response;
根据此程序,可以返回融合图⽚的base64编码,再解码就可以得到图⽚
Python版实现
以下代码是博主参照php的改写⽽成,值得注意的问题是urlencode是⼀种特定的数据格式,尤其是图⽚信息⼀定要按此编码,否则返回错误信息
# coding=utf-8
import requests
import time
import random
import hashlib
import base64
from urllib import urlencode
def get_sign(para, app_key):
# 签名的key有严格要求,按照key升序排列
data = sorted(para.items(), key=lambda item: item[0])
s = urlencode(data)
# app_key最后加
s += '&app_key=' + app_key
# 计算md5报⽂信息
md5 = hashlib.md5()
md5.update(s)
digest = md5.hexdigest()
return digest.upper()
url = 'api.ai.qq/fcgi-bin/ptu/ptu_facemerge'
app_key = 'your_app_key'
# 读取图⽚数据
raw_data = open('test.jpg').read()
image_data = base64.b64encode(raw_data)
# 定义发送的post数据
data = {
'app_id': 'your_app_id',
'image': image_data,
'model': '1',  # 选定想要融合的模板
'time_stamp': str(int(time.time())),
'nonce_str': str(random.random()),
}
data['sign'] = get_sign(data, app_key)
# 发送post请求
r = requests.post(url, data=data)
# 将得到的数据解码,然后保存到jpg
res_image = base64.b64decode(r.json()['data']['image'])
img = open('out.jpg', 'w')
img.write(res_image)
python json字符串转数组img.close()
效果
输⼊图⽚(⽹上的⼈脸图⽚,侵删)
test.jpg
腾讯给出的融合模板1
输出
out.jpg
⼩结
这次实验的逻辑其实不是很复杂,知识点主要是签名算法和POST请求。可以看到Python的代码⽐PHP简短得多,主要是⽤到了⼀些封装好的库
有了⼈脸融合这项服务后,感觉可以做很多有趣的事情~

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。