用Python让蔡徐坤在我的命令行里打篮球!|附完整代码

640?wx_fmt=gif 点击上方↑↑↑蓝字关注我们~

640?wx_fmt=jpeg

2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑


来源 | 01二进制(ID:gh_d1999add1857)

编辑 | Jane


【导语】作者自称是一个经常逛 B 站的肥宅。最近 B 站上流行的视频素材除了“换脸”,其次就要属“蔡xx打球”视频了。有模仿的、对比的、手绘的... ...更过分的是,竟然有人在命令行输出了他的打球视频。不过,视频中的动画好像是用某个软件生成的 txt 文件,作者就在想既然都可以用 txt 输出了,能不能用 python 在命令行中显示呢?


说到这作者便开始搜索资料,做后制作了下面一段视频“



代码是自己在网上查询资料后自己修改的,本着学习和分享的精神,今天就来分享下上面这段视频的制作过程。


原理


既然要开始做东西,首要的问题就是想好要怎么做,大家都知道视频是由一系列图片一帧一帧组成的,因此视频转字符动画最基本的便是图片转字符画。


在这里简单的说一下图片转字符画的原理:首先将图片转为灰度图,每个像素都只有亮度信息(用 0~255 表示)。然后我们构建一个有限字符集合,其中的每一个字符都与一段亮度范围对应,我们便可以根据此对应关系以及像素的亮度信息把每一个像素用对应的字符表示,这样字符画就形成了。

Tips:如果对"灰度图像"这个概念不太理解的可以查阅百度百科

计算一张图片的灰度图像的方法如下(来自百度百科):


640?wx_fmt=jpeg


所以我们要做的就只是让字符画在命令行里面动起来就可以了。

Tips:图片转字符画可以参考:https://www.shiyanlou.com/courses/370

准备


环境和工具:vscode、Mac OS、python 3.7

这次实验使用到的核心的库是opencv-python


Tips:这里分享一个我觉得还不错的opencv-python的中文文档: https://www.kancloud.cn/aollo/aolloopencv/269602

实验


实验开始前我们需要安装 opencv-python 的包:



 

1pip install opencv



读取视频:



 

1def genCharVideo(self, filepath):
2
3self.charVideo =[]
4
5# 用opencv读取视频
6
7cap = cv2.VideoCapture(filepath)
8
9self.timeInterval = round(1/ cap.get(5),3)
10
11nf = int(cap.get(7))
12
13print('Generate char video, please wait...')
14
15for i in pyprind.prog_bar(range(nf)):
16
17# 转换颜色空间,第二个参数是转换类型,cv2.COLOR_BGR2GRAY表示从BGR↔Gray
18
19rawFrame = cv2.cvtColor(cap.read()[1], cv2.COLOR_BGR2GRAY)
20
21frame = self.convert(rawFrame, os.get_terminal_size(), fill=True)
22
23self.charVideo.append(frame)
24
25cap.release()



这里的VideoCapture是用来读取视频的, cv2.cvtColor(input_imageflag)用于转换颜色空间,其中flag就是转换类型。对于 BGR↔Gray 的转换,我们使用的 flag 就是 cv2.COLORBGR2GRAY。对于 BGR↔HSV 的转换我们用的 flag 就是 cv2.COLORBGR2HSV。


将帧转换成字符画



 

1ascii_frame
2
3ascii_char ="$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. "
4
5
6
7# 像素映射到字符
8
9def pixelToChar(self, luminance):
10
11return self.ascii_char[int(luminance /256* len(self.ascii_char))]
12
13
14
15# 将普通帧转为 ASCII 字符帧
16
17def convert(self, img, limitSize=-1, fill=False, wrap=False):
18
19if limitSize !=-1and(img.shape[0]> limitSize[1]or img.shape[1]> limitSize[0]):
20
21img = cv2.resize(img, limitSize, interpolation=cv2.INTER_AREA)
22
23ascii_frame =''
24
25blank =''
26
27if fill:
28
29blank +=' '*(limitSize[0]- img.shape[1])
30
31if wrap:
32
33blank +='\n'
34
35for i in range(img.shape[0]):
36
37for j in range(img.shape[1]):
38
39ascii_frame += self.pixelToChar(img[i, j])
40
41ascii_frame += blank
42
43return ascii_frame



这段代码其实就是将已经转变的灰度图的像素值映射到 ascii_char上,然后输出到控制台。


控制输出


 

1# 创建线程
2
3getchar = threading.Thread(target=getChar)
4
5# 设置为守护线程
6
7getchar.daemon =True
8
9# 启动守护线程
10
11getchar.start()
12
13# 输出的字符画行数
14
15rows = len(self.charVideo[0])// os.get_terminal_size()[0]
16
17for frame in self.charVideo:
18
19# 接收到输入则退出循环
20
21if breakflag:
22
23break
24
25self.streamOut(frame)
26
27self.streamFlush()
28
29time.sleep(self.timeInterval)
30
31# 共 rows 行,光标上移 rows-1 行回到开始处
32
33self.streamOut('\033[{}A\r'.format(rows -1))
34
35# 光标下移 rows-1 行到最后一行,清空最后一行
36
37self.streamOut('\033[{}B\033[K'.format(rows -1))
38
39# 清空最后一帧的所有行(从倒数第二行起)
40
41for i in range(rows -1):
42
43# 光标上移一行
44
45self.streamOut('\033[1A')
46
47# 清空光标所在行
48
49self.streamOut('\r\033[K')
50
51if breakflag:
52
53self.streamOut('User interrupt!\n')
54
55else:
56
57self.streamOut('Finished!\n')


执行


最后在main函数中设置下要读取的文件名,再play一下就可以了


 

1if
2__name__ =='__main__':
3
4v2char = V2Char('vedio.mp4')
5
6v2char.play()



完整代码链接:

https://pan.baidu.com/s/1ZTc2a7DU-NIneI-CCbPu8Q 

提取码: jc3n 

作者简介:雇个城管打天下,理工男一枚。南京大学软件工程系硕士,一个还在做着拥有十万读者梦的互联网新人,或许一篇文章无法获得你的关注,但突然梦想觉醒的我还在努力着!


(本文为AI科技大本营转载文章,转载请微信联系原作者)



倒计时两天


「2019 Python开发者日」演讲议题全揭晓!这一次我们依然“只讲技术,拒绝空谈”10余位一线Python技术专家共同打造一场硬核技术大会。更有深度培训实操环节,为开发者们带来更多深度实战机会。目前大会倒计时 2 天,更多详细信息请咨询13581782348(微信同号)。


640?wx_fmt=jpeg

推荐阅读:


  • 39个国外SCI抢发6万篇中国英文论文?然而,真正的问题是……

  • 专访博世王红星:大数据和AI将是中国制造业升级新动力

  • 抵制996!Python之父发声背后,这个社区一呼百应!

  • 什么是网络爬虫?有什么用?怎么爬?终于有人讲明白了

  • 京东或将裁员 12000 人!雷军年薪百亿;马云:阿里没人敢跟我打赌 | 极客头条

  • 偷电、挖矿、赚快钱,这些大学生到底怎么了?

  • 终于有人把5G和边缘计算的关系说清楚了 | 技术头条

  • 频繁跳槽涨工资?会影响征信的!| 畅言

  • 刺激!我31岁敲代码10年,明天退休!


640?wx_fmt=png


点击“阅读原文”,了解「2019 Python开发者日」

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/353558.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

自动化测试,B、C接口要将A接口返回的参数作为入参,有哪些方法?

在进行自动化测试时&#xff0c;如果需要将A接口返回的参数作为B、C接口的入参&#xff0c;可以通过以下几种方法实现&#xff1a; 如果你想学习自动化测试&#xff0c;我这边给你推荐一套视频&#xff0c;这个视频可以说是B站百万播放全网第一的自动化测试教程&#xff0c;同…

直播带货APP小程序系统开发功能有哪些?

直播带货APP小程序系统开发功能有哪些&#xff1f; 1、直播带货&#xff1a;主播一边带货一边直播间活跃气氛&#xff0c;直观地了解产品&#xff0c;下单的概率会更高。还集有观看、打赏、购物、分享于一体。 2、短视频带货&#xff1a;短视频种草&#xff0c;利…

KCNScrew for Mac(mac序列号工具)

KCNScrew for Mac是一款序列号工具&#xff0c;是一款十分简单好用的序列号查找工具。该软件的数据每个月都会更新&#xff0c;包含将近上千款软件的序列号提供给大家。如果你还在苦恼于软件因为没有序列号而不能正常使用到话&#xff0c;想要查看软件序列号的朋友欢迎&#xf…

CuteFTP,8uftp cuteftp

CuteFTP&#xff0c;FTP工具之一&#xff0c;其传输速度比较快&#xff0c;但有时对于一些教育FTP 站点却无法连接。我在进行ftp工具查找时&#xff0c;还发现了这么一款软件&#xff1a;IIS7服务器管理工具。 作为IIS7服务器管理工具&#xff0c;它可以对ftp站点进行批量管理…

Win10下SCP命令免密码上传、下载工程师服务器上的文件

【1】本地win10操作步骤 1&#xff09;在本地win10系统打开命令行工具&#xff08;winr&#xff09; 2&#xff09;执行命令&#xff1a;ssh-keygen -t rsa 3&#xff09;提示输入保存路径&#xff0c;直接回车&#xff0c;默认即可。 4&#xff09;提示输入密码&#xff0c;因…

CAN-TP帧类型(SF/FF/CF/FC)解析

简介 CAN-TP帧类型可分为 单帧和多帧。 单帧(SF) &#xff1a; Single Frame,数据长度小于等于7个Byte&#xff08;标准CAN是7Byte,CAN-Fd是63Byte&#xff09;时&#xff0c;使用单帧进行传输 多帧可分为 首帧&#xff08;FF&#xff09;/流控帧&#xff08;FC&#xff09;…

tcp 序列号

父 tcp,状态. from异常流程_个人渣记录仅为自己搜索用的博客-CSDN博客 转载请注明出处&#xff1a;6-TCP6-TCP 协议&#xff08;序号和确认号&#xff09;_tcp 最终确认序号_--Allen--的博客-CSDN博客6-TCP 接下来的内容是学习后续内容的基础&#xff0c;必须先讲清楚。为了…

手把手带你YOLOv5/v7 添加注意力机制,30多种模块分析①,SE模块,SK模块

目录 一、注意力机制介绍1、什么是注意力机制&#xff1f;2、注意力机制的分类3、注意力机制的核心 二、SE模块1、SE模块的原理2、代码实例3、实验结果4、应用示例&#xff08;1&#xff09;在 models/yolo.py 文件中定义 SEModule 类&#xff0c;用于实现SE模块。&#xff08;…

安装使用cuteFTP注意事项

花絮&#xff1a; 一直以来都使用红帽的共享文件来让windows和linux之间进行传输文件&#xff0c;今天头脑一发热&#xff0c;想使用windows下的cuteFTP软件来代替前面的方法。可谁想到&#xff0c;一是cuteFTP在网上根本找不到序列号&#xff0c;找了N久没找到&#xff0c;后…

CuteFTP安装

CuteFTP 9破解版&#xff0c;百度网盘链接&#xff1a;https://pan.baidu.com/s/16SDjxyQF2WtiPKpZHjcueQ 密码&#xff1a;xblr CuteFTP 9破解版是一款非常实用的商业FTP软件&#xff0c;也就是一个FTP客户端。可能很多人不知道FTP是什么&#xff0c;就是一个文件传输系统&…

Java 面试题:Spring,Spring MVC,Spring Boot 之间什么关系?

来&#xff0c;先和我看张图&#xff1a; Spring全家桶了为了解决不同场景的问题&#xff0c;逐渐演化出多套生态环框&#xff0c;如&#xff1a;Spring、SpringMVC、SpringBoot、SpringCloud。 Spring MVC和Spring Boot都属于Spring&#xff0c;Spring MVC是基于Spring的一个…

Springboot配置文件中的明文密码漏洞

目录 一、背景 二、本地修复测试 1、maven中引入jasypt 2、编写加密解密工具类 3、修改配置文件&#xff0c;增加秘钥 4、秘钥放在启动项 三、生产实现 1、升级打包代码 2、生产yml修改明文密码处 3、修改启动命令 一、背景 最近接收到网安的系统安全…

高德地图添加遮罩,实现圈出某个特定的地区

实现效果 一、准备 1、注册账号并申请Key 2、准备页面 <script type"text/javascript" src"https://webapi.amap.com/maps?v1.4.15&key您申请的key值"></script> <div id"container"></div>#container {widt…

vue 高德地图贴地点

效果图 引入高德api maps和local local 用的2.0.0的 其他版本可能会有不兼容问题 mounted(){//设置 地图this.map new AMap.Map(container, {mapStyle: , // 设置地图的自定义样式-深色zoom: 7.3, //级别center: [119.1, 36.32], //中心点坐标viewMode: 3D, // 地图模式resiz…

iOS 跳转到地图后导航(高德地图,百度地图,腾讯地图,苹果手机原生的地图)

1.现在info.plist里面如下图所示添加 2.在下图输入框中输入地名&#xff0c;然后点击前往目的地会出现如下图所示。&#xff08;如果你不知道地方名如何转化为经纬度请看我的另一篇博客&#xff1a;http://blog.csdn.net/chenyongkai1/article/details/51891135&#xff09; 3.…

高德导航免费,那他靠什么收入?

来源 &#xff5c;一口Linux 一位工作了12年的软件工程师说&#xff1a;当你打开导航时&#xff0c;不需要任何费用&#xff0c;还会给高德公司带来丰厚的收入。当时我不信&#xff0c;去查了相关资料后&#xff0c;才知道这个行业不简单。 出门外出&#xff0c;对路线不熟时&a…

C++编译一些常见的错误集锦

1、段错误&#xff08;Segmentation Fault&#xff09; &#xff08;1&#xff09;段错误&#xff08;Segmentation Fault&#xff09;是一种常见的计算机程序错误&#xff0c;通常指向程序试图访问的内存地址超出了程序可访问的内存范围&#xff0c;或者指针指向了无效的内存…

分布式光伏发电远程监控系统

分布式光伏发电远程监控系统 项目背景 新能源、可再生能源接入电网是智能电网建设的重要组成&#xff0c;也是能源互联网发展的基础。近年来&#xff0c;太阳能光伏发电技术快速发展&#xff0c;光伏发电并网对配电网的影响也不断加深。电网调度人员需要人工参与光伏发电站的发…

短视频矩阵源码技术开发

短视频矩阵是一种常见的视频编码标准&#xff0c;它通过将视频分成多个小块并对每个小块进行压缩来实现高效的视频传输。在本文中&#xff0c;我们将介绍短视频矩阵的原理和实现&#xff0c;并提供示例代码。 $where_time array(); // 时间 $where_time[] array(name>fbr…

运用正则表达式匹配QQ邮箱

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1.首先创建一个新文件夹 1.命名好名字后用Visual Studio Code打开 创建一个HTML文档用&#xff01;字符按下tab键后完成基本格式 创建一个input标签占位符写下请输入QQ邮箱再给他一个id方便调用 …