七夕礼物:火柴人特效制作

简介: 七夕礼物:火柴人特效制作

前言


  闲来无事,偶然作乐,突发奇想,如何将跳舞视频进行抽象化:


1. 提取视频中人物的动作

2. 替换视频中背景图像

针对如上需求,在这里我将为大家带来制作骨架人物动作提取视频,大家可以分享给对象进行视频制作!



准备工作


在进行制作"抽象画面"制作的时候,我们需要做如下准备工作:


  1. 舞蹈视频(可以抖音等视频网站上面下载)
  2. 当然是本人中将要为大家带来的代码辣


制作步骤:


  1. 制作背景图像。这里我以纯色背景为例子,进行制作背景图像,大家也可以进行挑选自己喜欢的图像作为背景
  2. 人物动作提取。这里采用mediapipe库进行人物动作骨架提取
  3. 动作融合到背景图中。这里我们将人物动作提取出来,绘制到背景图像中去。




制作背景图像


创建图像:


  在OpenCV中,黑白图像实际是一个二维数组,彩色图像是一个三维数组。在数组中每个元素就是图像对应位置的像素值。数组索引、像素行列、像素坐标关系如下:

a. 数组行索引 = 像素所在行数 - 1 = 像素纵坐标

b. 数组列索引 = 像素所在列数 - 1 = 像素横坐标

PS: 在黑白图像中,像素为0为纯黑色,像素为255为纯白色


创建随机像素三通道(RGB)图像:


  1. 像素点下标为0([:, :, 0])是①通道,代表蓝色\
  2. 像素点下标为0([:, :, 1])是②通道,代表绿色\
  3. 像素点下标为0([:, :, 2])是③通道,代表红色

  4. OpenCV彩色图像默认为BGR格式,是三维数组,第三个索引表示三基色颜色分量

RGBImg.py如下,我们可以设置指定的RGB图,然后输入视频帧Size即可:


import numpy as np
import cv2 as cv
R = int(input("请输入R值:"))
G = int(input("请输入G值:"))
B = int(input("请输入B值:"))
width = int(input("请输入图像宽度:"))
height = int(input("请输入图像高度:"))
img = np.zeros((height, width, 3), np.uint8)
img_rgb = img.copy()
img_rgb[:, :, :] = [B, G, R]
cv.imwrite('./1111.jpg', img_rgb)
cv.imshow("img_rgb", img_rgb)
cv.waitKey()
cv.destroyAllWindows()
复制代码




动作提取&融合


  采用mediapipe库进行人体动作骨架的提取,其核心如下:


  ML网络采用两步检测器和跟踪器,使用检测器,网络首先在一帧内定位人/姿势感兴趣区域(ROI)。跟踪器然后使用ROI裁剪帧作为输入,以预测ROI内的姿态地标和分割掩码。我们在对视频处理时,仅在需要时调用检测器,即:对于第一帧,并且当跟踪器无法再识别前一帧中存在的身体姿势时。对于其他帧,管道仅从前一帧的姿势标志导出ROI。管道被实现为一个MediaPipe图,该图使用来自pose landmarks模块的pose Lanemarks子图,并使用专用的pose renderer子图进行渲染。姿势地标子图在内部使用来自姿势检测模块的姿势检测子图。


程序逻辑:


  1. 初始化mediapipe模块


  1. 读取视频


  1. 设置mediapipe模块参数


  1. 设置静态写入


  1. 背景图像的读取


  1. 将提取骨骼框架绘制在背景图上


  1. 输出绘制好的图像



import cv2
import mediapipe as mp
import numpy as np
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_pose = mp.solutions.pose
cap = cv2.VideoCapture('test.mp4')
with mp_pose.Pose(
    min_detection_confidence=0.7,
    min_tracking_confidence=0.7) as pose:
  name = 1
  while cap.isOpened():
    success, image = cap.read()
    if not success:
      print("Ignoring empty camera frame.")
      # If loading a video, use 'break' instead of 'continue'.
      break
    # To improve performance, optionally mark the image as not writeable to
    # pass by reference.
    image.flags.writeable = False
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    results = pose.process(image)
    # Draw the pose annotation on the image.
    image.flags.writeable = True
    # image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
    image = cv2.imread('a.jpg')
    mp_drawing.draw_landmarks(
        image,
        results.pose_landmarks,
        mp_pose.POSE_CONNECTIONS,
        landmark_drawing_spec=mp_drawing_styles.get_default_pose_landmarks_style())
    # Flip the image horizontally for a selfie-view display.
    cv2.imwrite('./111/%s.jpg' %name, cv2.flip(image, 1))
    name = name + 1
    # cv2.imshow('MediaPipe Pose', cv2.flip(image, 1))
    # if cv2.waitKey(5) & 0xFF == 27:
    #   break
cap.release()
复制代码



成果展示


这里我选取的舞蹈片段,舞蹈名称:《傣》


image.png

相关文章
|
5月前
情人节浪漫3D照片墙【附源码】
情人节浪漫3D照片墙【附源码】
47 4
|
5月前
|
JSON 人工智能 数据格式
在PAI Artlab一键实现欧洲杯粉丝专属贴纸制作
嘿,各位足球狂热分子,准备好迎接欧洲杯的狂欢了吗?你的加油装备还缺了点啥?别担心,ArtLab平台一键贴纸生成工作流,来给这足球盛宴加点料啦!快来,让我们一起把激情和创意混搭出新高度!
在PAI Artlab一键实现欧洲杯粉丝专属贴纸制作
|
3月前
|
前端开发
七夕特效惊艳全场!HTML+CSS带你DIY酷炫表白神器
七夕特效惊艳全场!HTML+CSS带你DIY酷炫表白神器
|
前端开发 JavaScript
七夕表白,不给女朋友来场炫酷的烟花?
七夕表白,不给女朋友来场炫酷的烟花?
88 0
【代码分享】【像极了恋爱】甜甜的汤圆,祝丽姿元宵快乐(表白特效)
【代码分享】【像极了恋爱】甜甜的汤圆,祝丽姿元宵快乐(表白特效)
115 0
|
前端开发 机器人 程序员
六一 特效~ 你也是大小孩
六一 特效~ 你也是大小孩
106 0
|
C语言 C++
C/C++实现跨年表白烟花
C/C++实现跨年表白烟花
461 0
|
小程序 开发工具
樱花飘落模拟器-情人节祝你表白成功
看着樱花缓缓的飘落,然后不觉间竟下起了绵绵的细雨。因为今天我所在的城市正下着小雨,所以就在这个小应用中增加了阵阵的细雨功能。 下面我们就学习一下如何实现一个这样温暖的小程序。 首先准备一下素材。一个粉色的背景,两个樱花花瓣,一个模拟雨滴的长方形,以及两句要显示的话。
132 0
如何快速的制作一个下雨的效果
本文主要内容教你使用微信小游戏制作工具快速的实现一个下雨的效果。 如果你没有任何的游戏开发经验,欢迎观看我的“人人都能做游戏”系列视频教程,它会手把手的教你做出自己的第一个小游戏。 今天分享一个如何利用微信小游戏制作工具快速的制作一个小雨的效果。
85 0