Python免费调用腾讯云API实现人脸年龄变化
上次分享了腾讯云的图片文本识别,教你如何白嫖腾讯云证件,卡片识别:https://www.52pojie.cn/thread-1895474-1-1.html
(出处: 吾爱破解论坛)
今天再分享一个免费调用腾讯云API实现人脸年龄变化,效果如下,这个女神是谁呢?
先登录腾讯云:
https://cloud.tencent.com/document/product/1202/42921
找到购买指南,查看免费额度,依然是1000次每月。
再找到操作指南,先进控制台开通该功能。再进入调试界面。
开通就不说了,很简单,按照提示点击开通就行。
说一说怎么用Python调用。点击人像变换API后,找到左侧的API文档-调用方式-人脸年龄变化想过接口,再点击“点击调试”,如下图。
我们就会进入调试界面,详细操作就不多说了,可以看看之前那篇文章怎么装库,怎么获取密钥。
重点再说说中间那3个参数,输入这3个就可以了。
第一个,必选,选择地区
第二个,“Image”和“Url”,图片的 Url、Image必须提供一个,如果都提供,只使用 Url。
第三个,就是变换后的年龄。
详细信息,可以点那个带圈的i,也可以回到刚刚那个API文档页面,查看“2.输入参数”,里面也有详细介绍。
此时,我们就获得了python代码,将其复制到IDE中。
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.ft.v20200304 import ft_client, models
try:
# 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
# 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305
# 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
cred = credential.Credential("SecretId", "SecretKey")
# 实例化一个http选项,可选的,没有特殊需求可以跳过
httpProfile = HttpProfile()
# 推荐使用北极星,相关指引可访问如下链接
# https://git.woa.com/tencentcloud-internal/tencentcloud-sdk-python#%E5%8C%97%E6%9E%81%E6%98%9F%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B
httpProfile.endpoint = "ft.tencentcloudapi.com"
# 实例化一个client选项,可选的,没有特殊需求可以跳过
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
# 实例化要请求产品的client对象,clientProfile是可选的
client = ft_client.FtClient(cred, "ap-beijing", clientProfile)
# 实例化一个请求对象,每个接口都会对应一个request对象
req = models.ChangeAgePicRequest()
params = {
"Image": "图片的64base数据",
"AgeInfos": [
{
"Age": 60
}
]
}
req.from_json_string(json.dumps(params))
# 返回的resp是一个ChangeAgePicResponse的实例,与请求对象对应
resp = client.ChangeAgePic(req)
# 输出json格式的字符串回包
print(resp.to_json_string())
except TencentCloudSDKException as err:
print(err)
现在还不能用,首先将你自己的SecretID和SecretKey复制到cred = credential.Credential("SecretId", "SecretKey")里面。
"SecretId", "SecretKey"换成你的ID和Key。
然后就是params里的“Image”,这里面我们要放一个图片的base64数据。
分享一个方法,如下:
from PIL import Image
import io
import base64
def to_base64_data(pic_path):
# 打开并读取图像文件
image = Image.open(pic_path)
# 转换图像到RGB格式
rgb_image = image.convert("RGB")
# 创建字节流对象
byte_stream = io.BytesIO()
# 保存图像到字节流中
rgb_image.save(byte_stream, format='JPEG')
# 从字节流中获取图像的base64编码
base64_data = base64.b64encode(byte_stream.getvalue()).decode('utf-8')
return (base64_data)
base64_data = to_base64_data('1.png') #换成你的图片地址
base64_data就是图片的base64数据了,将其传给params里的“Image”就可以了。
最后,就是返回的数据,官方示例是用resp.to_json_string(),转换成了一个json数据,而我们是想要其中的base64,放在了“ResultImage”里面。
那么我么就用resp.ResultImage获取,获取到了base64,就可以转换为图片了。
import base64
# 假设你的Base64编码字符串为'encoded_string'
encoded_string = resp.ResultImage
# 从Base64编码字符串中提取图片数据
# 确保已删除了'data:image/png;base64,'前缀
image_data = base64.b64decode(encoded_string)
# 将解码后的数据保存为PNG文件
with open('output.png', 'wb') as f:
f.write(image_data)
print('转换完成!')
这是一个年龄的结果,如果我们想要30到90岁,每3年获取一张呢,那就用for循环。参考代码如下:
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.ft.v20200304 import ft_client, models
from PIL import Image
import io
import base64
def to_base64_data(pic_path):
# 打开并读取图像文件
image = Image.open(pic_path)
# 转换图像到RGB格式
rgb_image = image.convert("RGB")
# 创建字节流对象
byte_stream = io.BytesIO()
# 保存图像到字节流中
rgb_image.save(byte_stream, format='JPEG')
# 从字节流中获取图像的base64编码
base64_data = base64.b64encode(byte_stream.getvalue()).decode('utf-8')
return (base64_data)
#需要换成你的ID和Key
SecretId = "AKIDaC********************"
SecretKey = "lYOB************************"
#换成你的图片地址
pic_path = '1.png'
cred = credential.Credential(SecretId, SecretKey)
# 实例化一个http选项,可选的,没有特殊需求可以跳过
httpProfile = HttpProfile()
# 推荐使用北极星,相关指引可访问如下链接
# https://git.woa.com/tencentcloud-internal/tencentcloud-sdk-python#%E5%8C%97%E6%9E%81%E6%98%9F%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B
httpProfile.endpoint = "ft.tencentcloudapi.com"
# 实例化一个client选项,可选的,没有特殊需求可以跳过
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
# 实例化要请求产品的client对象,clientProfile是可选的
client = ft_client.FtClient(cred, "ap-beijing", clientProfile)
# 实例化一个请求对象,每个接口都会对应一个request对象
req = models.ChangeAgePicRequest()
for i in range (60,90,3):
params = {
"Image": to_base64_data(pic_path),
"AgeInfos": [
{
"Age": i
}
]
}
req.from_json_string(json.dumps(params))
# 返回的resp是一个ChangeAgePicResponse的实例,与请求对象对应
resp = client.ChangeAgePic(req)
# 从Base64编码字符串中提取图片数据
image_data = base64.b64decode(resp.ResultImage)
# 将解码后的数据保存为PNG文件
with open('output{}.png'.format(i), 'wb') as f:
f.write(image_data)
生成了很多张图片,我们在用imageio库合并成gif格式。
#pip install imageio
import imageio
import os
pic_path = r'D:\python\pic'
pix_list = os.listdir(pic_path)
# 定义图片列表,将图片的路径添加到列表中
image_list = os.listdir(pic_path)
# 定义输出的GIF文件名
gif_name = 'output.gif'
# 定义每张图片在GIF中的显示时间(单位为秒),这里设置为0.1秒
duration = 0.1
# 创建一个空列表来存储所有图片帧
frames = []
# 遍历图片列表,将每张图片读取并添加到帧列表中
for image_path in image_list:
image_path1 = os.path.join(pic_path,image_path)
image = imageio.imread(image_path1)
frames.append(image)
# 使用imageio的mimsave函数将帧列表保存为GIF文件
imageio.mimsave(gif_name, frames, 'GIF', duration=duration)
print("GIF文件生成完成!") 腾讯云上测试过了,感觉还是个半成品,动漫、性别转换、年龄,都是固定的样子,特别是动漫,就是把一张图P在了脸上,测试的时候有1/4的脸还没盖住 按照楼主方法,我试了 人像动漫化SDK ,确实可以用,填个id 密钥 和 图片入参就行,就是那个转换有点不太好看。。。。{:1_907:} 第一张gif咋不动呢???再上次一次试一试。。。 lianxiang1122 发表于 2024-4-3 12:29
第一张gif咋不动呢???再上次一次试一试。。。
还是不行,上传完了变成一张图片了。。。。。。不知道咋弄。。。。 感谢楼主分享 mark,感谢分享 先插个眼,慢慢研究
谢谢分享 感谢分享 感谢分享 谢谢分享,很实用的教程 很详细,感谢分享!
页:
[1]
2