AI特效!汤圆秒变云宝
【摘要】 AI特效!汤圆秒变云宝本案例先用目标检测检测图片中汤圆的位置,然后将每个汤圆的图片和熊猫头的图片进行融合,最后将图片中所有汤圆都变成了云宝!效果图如下: 实现步骤 1. 导入需要的Python模块"""在线服务批量测试脚本"""import osimport cv2import numpy as npfrom PIL import Imagefrom modelarts.session i...
AI特效!汤圆秒变云宝
本案例先用目标检测检测图片中汤圆的位置,然后将每个汤圆的图片和熊猫头的图片进行融合,最后将图片中所有汤圆都变成了云宝!效果图如下:
实现步骤
1. 导入需要的Python模块
"""
在线服务批量测试脚本
"""
import os
import cv2
import numpy as np
from PIL import Image
from modelarts.session import Session
from modelarts.model import Predictor
session = Session()
2. 订阅汤圆检测模型,部署成在线服务
点此链接进入进入汤圆检测模型界面,点击订阅,继续订阅,前往控制台,云服务区域选择华北-北京四,点击部署,下拉选择部署成在线服务,名称自定义,规格选择[限时免费]CPU: 1 核 4GB
,每个用户只能拥有一个免费规格在线服务,如已使用可选择CPU: 2 核 8GB
,点击右下角下一步,提交,等待部署成功可查看到服务ID,填入下面的步骤。
3. 获取在线服务ID,初始化预测器
请注意修改service_id
service_id = "93f1dc76-957e-47e3-abaf-6c89dd71d539" # TODO,请修改此处代码
predictor_instance = Predictor(session, service_id=service_id) # 预测器初始化
4. 准备汤圆图片和云宝模板图
!wget https://liufan-lab.obs.cn-north-4.myhuaweicloud.com/tangyuan.jpg
!wget https://liufan-lab.obs.cn-north-4.myhuaweicloud.com/yunbao.png
def single_img_detect(predictor_instance, img_path):
"""
物体检测在线服务测试
"""
output_dir = os.path.dirname(os.path.abspath(img_path)) + '_output'
if not os.path.exists(output_dir):
os.mkdir(output_dir)
predict_result = predictor_instance.predict(data=img_path, data_type="images")
detection_classes = predict_result.get('detection_classes', None)
detection_boxes = predict_result.get('detection_boxes', None)
detection_scores = predict_result.get('detection_scores', None)
if detection_classes is not None:
return detection_boxes
else:
return None
tangyuan_img_path = './tangyuan.jpg' # TODO,待测试的汤圆图片路径
detection_boxes = single_img_detect(predictor_instance, tangyuan_img_path)
if detection_boxes is None:
print("没有检测到汤圆")
else:
print("汤圆位置的检测结果如下:")
for box in detection_boxes:
print(box)
汤圆位置的检测结果如下:
[465.0, 223.0, 853.0, 650.0]
[591.0, 648.0, 869.0, 949.0]
[775.0, 55.0, 1061.0, 375.0]
[842.0, 482.0, 1148.0, 785.0]
[376.0, 593.0, 620.0, 869.0]
[490.0, 35.0, 615.0, 249.0]
[293.0, 119.0, 519.0, 384.0]
[240.0, 386.0, 463.0, 653.0]
[599.0, 2.0, 797.0, 247.0]
5. 合成汤圆和表情包的图片
def merge_image(tangyuan_img_path, bing_img_path, detection_boxes):
"""
合成汤圆和表情包的图片
"""
src_img = cv2.imread(tangyuan_img_path) # 汤圆原图
src_img_alpha = cv2.cvtColor(src_img, cv2.COLOR_BGR2BGRA) # 将三通道的RGB原图转换为带透明通道的图
bing_img = cv2.imread(bing_img_path, cv2.IMREAD_UNCHANGED) # 带透明通道的表情包图
width = src_img_alpha.shape[1]
height = src_img_alpha.shape[0]
for box in detection_boxes:
x1 = max(0, int(box[1]))
y1 = max(0, int(box[0]))
x2 = min(width, int(box[3]))
y2 = min(height, int(box[2]))
img1 = src_img_alpha[y1:y2, x1:x2] # 获取汤圆图像块
img2 = cv2.resize(bing_img, (x2 - x1, y2 - y1)) # 将表情包图片缩放为和汤圆图像块一样大小
png_alpha = img2[:, :, 3] / 255.0 # 计算图片融合时的表情包图片权重
jpg_alpha = 1 - png_alpha # 计算图片融合时的原图权重
for c in range(0, 3): # 逐通道融合
src_img_alpha[y1:y2, x1:x2, c] = jpg_alpha * img1[:, :, c] + png_alpha * img2[:, :, c]
return src_img_alpha
bing_img_path = './yunbao.png' # TODO,表情包图片路径
merged_img = merge_image(tangyuan_img_path, bing_img_path, detection_boxes)
img_show = cv2.resize(merged_img, None, fx=0.3, fy=0.3) # 缩放为原图的0.3倍,方便展示
Image.fromarray(img_show[:, :, [2, 1, 0, 3]])
6. 上传自己的图片,生成特效
你可以找一张自己的汤圆图片,拖拽到左边的侧边栏进行图片上传,然后重新运行步骤3和4,即可生成新的熊猫头特效图,赶快试试吧!
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)