我正在参与「构思开发 投稿大赛」概况请看:构思开发大赛来了!

前语

  闲来无事,偶然作乐,突发奇想,如何将跳舞视频进行笼统化:
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])是③通道,代表赤色
    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模块
  2. 读取视频
  3. 设置mediapipe模块参数
  4. 设置静态写入
  5. 布景图画的读取
  6. 将提取骨骼框架制作在布景图上
  7. 输出制作好的图画
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()

效果展现

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