码神军训(四,五)——代码跳舞军体拳

吹水

今天,码神依旧凉爽,军体拳,摸鱼一天,所以早上就在操场趴着,**不过,我学会了, **信不信?看到抖音小姐姐的舞蹈,用代码做出来,还挺好看,我也想试一下,不会,学莫,反正假酒已经醒了。

想思路

总不能一个一个做吧,这可是一个视频,一个一个做我做到明年都弄不完,大致思路如下:

  • 视频变图片,专业术语:视频抽帧
  • 图片变字符,专业术语:把抽帧得到的图片集转换为字符画集
  • 字符变舞蹈,专业术语:循环打印,变成动画效果

代码实现

视频抽帧

将一段视频截取下来,使用GIF截取工具
码神军训(四,五)——代码跳舞军体拳_第1张图片

转化字符

将gif转化为字符
码神军训(四,五)——代码跳舞军体拳_第2张图片

用python导入库

import os
import re
import shutil
import cv2
from PIL import Image
import moviepy.editor as mpy

读取字符

def rename_gif():
    file_list = os.listdir("./temp")  # 读取当前文件夹所有文件
    # print(file_list)
    print("检测到文件夹下图片:")
    n = len(file_list)
    num_list = []
    num1 = num2 = 0
    for i in range(n):
        s = str(file_list[i])
        if s[-4:] == ".gif":  # 检查后缀
            res = re.findall(r"\d+", s)
            if res[0] == '1':
                num1 += 1
            if res[0] == '2':
                num2 += 1
            src = os.path.join(os.path.abspath('./temp/'), s)  # 原先的图片名字
            dst = os.path.join(os.path.abspath('./temp/'), res[0] + '-' + res[1]+'.gif')  # 根据自己的需要重新命名
            os.rename(src, dst)  # 重命名,覆盖原先的名字
    num_list.append(num1)
    num_list.append(num2)
    file_list = os.listdir("./temp")  # 读取当前文件夹所有文件
    for i in range(n):
        s = str(file_list[i])
        if s[-4:] == ".gif":  # 检查后缀
            res = re.findall(r"\d+", s)
            src = os.path.join(os.path.abspath('./temp/'), s)  # 原先的图片名字
            a = int(res[0])-1
            index = a*num_list[a-1]
            dst = os.path.join(os.path.abspath('./temp/'), str(index + int(res[1])) + '.gif')  # 根据自己的需要重新命名
            os.rename(src, dst)  # 重命名,覆盖原先的名字

循环输出

用到python中的一个库

pip install opencv-python

def charts2video(img_path, video_path):
    """将给定目录下的图片转成视频
    Args:
        img_path: 图片路径
        video_path: 输出视频的路径和名称
    Returns: 图片转成的视频
    """
    images = os.listdir(img_path)
    images.sort(key=lambda x: int(x[:-4]))  # 以名称字符串的数字从小到大排序  
    fps = 12  # 帧数
    fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'V')
    im = Image.open(img_path + images[0])
    video_writer = cv2.VideoWriter(video_path, fourcc, fps, im.size)
    for img_i in images:
        frame = cv2.imread(img_path + img_i)
        print('开始将 ' + img_i + ' 加入视频\n')
        video_writer.write(frame)  # 注意:图片尺寸必须和视频尺寸一样,不然不会被加入视频中!!!
    video_writer.release()

最后的代码舞视频我已经上传到B站了,大家可以一起来欣赏下喔。
还有就是我已经学会军体拳了,不用一直摸鱼了
https://www.bilibili.com/video/BV1RP4y18741/

你可能感兴趣的