用Python让蔡徐坤在我的命令行里打篮球~技术流追星!

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 


(*本文仅代表作者观点,转载请联系原作者)



精彩推荐


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


640?wx_fmt=jpeg


你也可以点击阅读原文查看大会详情。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「Python网络编程」如何让蔡徐坤同时唱跳rap篮球/初识多线程(二)

博主前言&#xff1a; 通过第一篇文章的学习&#xff0c;读者已经认识了网络编程中的套接字编程&#xff0c;已经具备了实现基于TCP协议和基于UDP协议网络编程中客户端的实现。第二篇文章打算让读者感受一下多线程的魅力&#xff0c;通过仔细阅读本篇文章完全可达到一文入门多线…

蔡徐坤用户画像

来源&#xff1a;挖数 作者&#xff1a;挖数 互联网行业经常会做用户调研&#xff0c;通过线下访谈和线上埋点等方式收集用户数据后&#xff0c;最终形成产品主流用户的性别、年龄、职业、喜好、城市等标签数据&#xff0c;这个过程称为“用户画像”。 如果蔡徐坤是一款互联网产…

小文智能结合ChatGPT的产业未来

最近几个月&#xff0c;由人工智能实验室OpenAI发布的对话式大型语言模型ChatGPT在国内外各大平台掀起了一阵AI狂潮。短短几天时间&#xff0c;其用户量就突破了百万大关&#xff0c;注册用户之多一度导致服务器爆满。 继AI画图之后&#xff0c;ChatGPT成为了新的顶流&#xf…

chatgpt赋能python:Python中绘制图形

Python中绘制图形 Python有很多强大的库可以用来绘制各种形式的图形。在这篇文章中&#xff0c;我们将介绍几个最常用的库&#xff0c;包括Matplotlib、Seaborn和Plotly。我们还将介绍如何用这些库绘制各种不同类型的图形。 Matplotlib Matplotlib是一个基于Python的绘图库&…

大模型带来的Web复兴,会是昙花一现吗?

大家是不是对GPT、对话式AI、生成式AI之类的话题&#xff0c;已经有点审美疲劳了&#xff1f; 写这篇文章之前&#xff0c;我有点犹豫&#xff0c;究竟还要不要接着讨论GPT了。最终决定写&#xff0c;是觉得个人用户、开发者&#xff0c;以及正在紧锣密鼓训大模型的AI公司和云厂…

【主流Chat模型的申请入口和方法】

主流Chat模型的申请入口和方法 一、申请New Bing二、申请内测文心一言三、申请内测Claude四、谷歌家的Bard五、Adobe Firefly六、GitHub Copilot chat七、通义千问八、360智脑一、申请New Bing 注册一个 outlook 邮箱,很简单,2分钟就可搞定~下载 Edge DEV 浏览器,用刚刚的邮…

券商要知道的港美股软件交易系统板块展示图

目前&#xff0c;国内做港美股软件开发的公司不超过5家&#xff0c;他们中不乏有些是行业的领头者&#xff0c;服务和技术可以说能让券商感到满意的&#xff0c;其中也有刚入门的技术不成熟&#xff0c;从设计上不够科学、系统的稳定性&#xff0c;也没有那么好。 一套完整的港…

用AkShare库获取A股股票数据—获取实时A股数据

前面给大家介绍了如何用Tushare获取A股股票数据&#xff0c;但是现在使用Tushare会受到积分限制&#xff0c;没有获得积分使用起来也麻烦。今天再给大家介绍一个免费的开源数据库AKShare。 AKShare 是基于 Python 的财经数据接口库, 目的是实现对股票、期货、期权、基金、外汇…

用AkShare获取沪深京A股所有股票历史数据

前面章节已经介绍了如何用AkShare调用A股实时的数据&#xff0c;但是在我们量化投资过程中&#xff0c;经常会需要用到全量数据&#xff08;即所有A股的历史数据&#xff09;。接下来我们讲讲用AkShare获取A股所有股票历史数据。 首先&#xff0c;我们通过AkShare的东财实时行情…

IOS 股票K线图的实现

2015-09-04 by 木易哥哥  智者精选&#xff0c;每天获取励志认知能量 www.5izhjx.com 写了lines、RKLineView、getData三个对象完成实现。 首先开始调用 rkLine [[RKLineViewalloc]init]; CGRect frame riKView.frame; frame.origin CGPointMake(0,5); frame.size CGSizeM…

【ChatGPT里的平行宇宙

除非你一直生活在岩石下&#xff0c;否则你肯定听说过ChatGP。 你可能知道它在解决 IQ 测试、解决 leetcode 问题或帮助人们编写 LateX 方面的能力。 它是人们检索各种信息和解决繁琐任务&#xff08;如文案写作&#xff09;的绝佳资源&#xff01; 今天&#xff0c;Frederic …

AIGC将颠覆设计界?!今晚直播间解密AIGC之图像生成史

从DeepFake、风格迁移到 Midjourney、DALLE ... AIGC的应用一次又一次带给我们惊喜 这些背后的蕴藏着哪些原理&#xff1f; 赶快加入AIGC图像生成直播课&#xff01; 探索AI生成艺术的奥秘 2月28日-3月7日每周二晚8点 系列直播课「扫码报名」啦&#xff01; 扫描下方二维码&…

chatgpt赋能python:Python导入照片的SEO优化指南

Python导入照片的SEO优化指南 在当今的数字时代&#xff0c;网站的视觉效果已经成为重要的一环。而在网站上展示照片既可以吸引用户的眼球&#xff0c;又可以更好地传达信息。然而&#xff0c;对于搜索引擎来说&#xff0c;照片是无法读懂的&#xff0c;它们需要依靠一些描述性…

chatgpt赋能python:Python怎么导入照片

Python怎么导入照片 Python是一种高级编程语言&#xff0c;可用于创建各种应用程序和项目。当涉及到处理图像时&#xff0c;Python也非常有用。在本文中&#xff0c;我们将介绍如何使用Python导入照片&#xff0c;并附带一些有关如何使用SEO优化您的图像的提示。 介绍 在开始…

作曲 app android,文艺又好玩!安卓作曲达人App试用体验

说起文艺&#xff0c;自然是离不开琴棋书画。喜欢文艺的机友为数不少&#xff0c;安卓平台也有不少关于琴棋书画的App。今天要介绍的这款安卓作曲达人App&#xff0c;可以说比它技术的没它文艺&#xff0c;比它文艺的没它技术。无论你懂不懂乐理&#xff0c;看着一个个音符在你…

妙计高招:短信验证码接收教程图像处理AI黑科技汇总

随着人工智能技术的越来越火爆&#xff0c;我们在使用国内外应用提供的功能时经常会用到短信验证功能&#xff0c;对于我们而言&#xff0c;轻松搞好短信验证没有那么容易&#xff0c;本篇文章对几篇接收验证码的教程进行了汇总并附带了一些主流AI软件的使用教程&#xff0c;希…

ChatGPT真的泰酷啦!泰酷啦!

马总来中国啦&#xff01;最近chatGPT有多火&#xff0c;就不用我多说了。。。 真的佩服Musk&#xff0c;其公司的产品每个都能出圈&#xff0c;虽然OpenAI只是他投的一个项目&#xff0c;但总感觉吸了他欧气的项目就总能火。就看会不会被twitter砸了招牌。但即便twitter垮了&a…

尝试使用chatgpt帮我优化sql

尝试写一些sql看看chatgpt写的和自己写的哪里不一样&#xff0c;帮助我打开思路。 第一题 数据库中有个员工表emp,建表语句如下: create table emp_his (emp_id number, emp_name varchar(50)); 表中存在重复记录(根据emp_id来判断),用SQL如何查出存在重复的 emp_id&#xff…

java 大结果_java三大工厂结果总览

2018-11-02 21:27:18 开始写 谢谢、Thank you、Salamat Do(撒拉玛特朵)、あリがCm o*n(嘉蒙)とゥ(阿里嘎都)、????? (勘三哈咪瘩)、terima Kasih(得力马卡系)、kob-khun(寇布库恩)、dhanyavaad(达尼阿瓦德)、toda(透达)、te?ekkr ederim(特谢库尔埃戴里姆)、Dzie,kuje(以…