使用mediapipe实现ikun表情包制作

626 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情


前言

   前些日子做了一份人物图像提取,更改背景的代码,今天一时心血来潮忍不住把蔡某坤打篮球视频剪贴下来想着制作一个表情包来玩玩,这里涉及的关键技术点有两个如何完成视频融合,融合后如何制作gif。这两个技术点中较难点是视频融合,在本文中我将着重于如何进行视频融合,原理部分将不再过多阐述。

开始制作

   由 juejin.cn/post/712452… 可以得到将视频中的任务分离出来,然后进行替换背景。

准备素材:蔡某坤的《鸡你太美》视频一份、任意鸡叫视频一份、代码如下自取。

实验整体步骤:

  1. 将两份视频分帧存储;
  2. 对两份视频帧进行归一化处理(这里我选择的是size=1080x760);
  3. 参考上述链接中地址原理使用如下代码完成蔡某坤和鸡叫视频融合;
  4. 对融合后视频进行制作gif。

代码逻辑流程:

  1. 对视频帧按照播放顺序命名(1~无穷);
  2. 建立mediapipe检测人物网络;
  3. 构造 for 循环按照帧名进行读取;
  4. 读取含有ikun的人物帧;
  5. 转换bgr2rgb空间;
  6. 设定检测阈值进行ikun人物提取;
  7. 选择背景图(方式同3中一样)
  8. 进行人物和背景融合
  9. 展示融合后的画面
  10. 将融合后的画面制作成gif
import cv2
import mediapipe as mp
import numpy as np

mp_drawing = mp.solutions.drawing_utils
mp_selfie_segmentation = mp.solutions.selfie_segmentation

for i in range(1, 1201):
    image = cv2.imread('./3/%s.jpg' % i)
    with mp_selfie_segmentation.SelfieSegmentation(
            model_selection=0) as selfie_segmentation:
        bg_image = None
        image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
        image.flags.writeable = False
        results = selfie_segmentation.process(image)
        image.flags.writeable = True
        image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
        condition = np.stack(
            (results.segmentation_mask,) * 3, axis=-1) > 0.5

        if bg_image is None:
            bg_image = cv2.imread('./5/%s.jpg' % i)
        output_image = np.where(condition, image, bg_image)

        cv2.imshow('MediaPipe Selfie Segmentation', output_image)
        cv2.imwrite("./4/%s.jpg" %i, output_image)

        if cv2.waitKey(5) & 0xFF == 27:
            break

seivl.gif