资讯专栏INFORMATION COLUMN

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

mayaohua / 1094人阅读

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

吹水

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

想思路

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

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

代码实现

视频抽帧

将一段视频截取下来,使用GIF截取工具

转化字符

将gif转化为字符

用python导入库

import osimport reimport shutilimport cv2from PIL import Imageimport 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/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/122571.html

相关文章

  • Java开发第一面————淘宝:难以割舍的痛

    摘要:供应商和经销商之间可以在线实时地提交订单查询产品供应和库存状况并获得市场销售信息及客户支持,实现了供应商与经销商之间端到端的供应链管理,有效地缩短了供销链。近期太多同学找我解惑,我经常劝大家不要过度焦虑,放平常心,其实我刚毕业时超级菜 B 的(放到今天工作都找不到那种),总结下来就是前面的 职场瓶颈:2~4 年前端走出离职困境与舒适区 的这些文章,于是我把刚入行在 ITEye 写的文章,统...

    Nekron 评论0 收藏0
  • Java多线程进阶(十九)—— J.U.C之synchronizer框架:CyclicBarrier

    摘要:当到达栅栏后,由于没有满足总数的要求,所以会一直等待,当线程到达后,栅栏才会放行。任务其实就是当最后一个线程到达栅栏时,后续立即要执行的任务。 showImg(https://segmentfault.com/img/remote/1460000016010958); 本文首发于一世流云专栏:https://segmentfault.com/blog... 一、CyclicBarri...

    tulayang 评论0 收藏0
  • 技术人攻略访谈二十:运维人的野蛮生长

    摘要:我一直认为运维工程师就是让跳舞的人,当我操纵几百台机器,整齐划一地做一件事情,那种感觉特别棒。技术人攻略你怎么看待,运维和开发的关系应该怎样平衡国内大家提得多 showImg(http://segmentfault.com/img/bVb66I); 技术人攻略:运维工作普遍很辛苦,你却能做得如此快乐,有哪些经验可以分享? 流程比补位更重要,方法比拼命更重要。UPYUN运...

    mating 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<