AI特效!汤圆秒变云宝

举报
HWCloudAI 发表于 2022/11/30 14:14:30 2022/11/30
【摘要】 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]])

png

6. 上传自己的图片,生成特效

你可以找一张自己的汤圆图片,拖拽到左边的侧边栏进行图片上传,然后重新运行步骤3和4,即可生成新的熊猫头特效图,赶快试试吧!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。