点击上方↑↑↑蓝字关注我们~

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

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

编辑 | Jane

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

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

播放

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

原理

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

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

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

所以我们要做的就只是让字符画在命令行里面动起来就可以了。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):23self.charVideo =[]45# 用opencv读取视频67cap = cv2.VideoCapture(filepath)89self.timeInterval = round(1/ cap.get(5),3)1011nf = int(cap.get(7))1213print('Generate char video, please wait...')1415for i in pyprind.prog_bar(range(nf)):1617# 转换颜色空间,第二个参数是转换类型,cv2.COLOR_BGR2GRAY表示从BGR↔Gray1819rawFrame = cv2.cvtColor(cap.read()[1], cv2.COLOR_BGR2GRAY)2021frame = self.convert(rawFrame, os.get_terminal_size(), fill=True)2223self.charVideo.append(frame)2425cap.release()

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

将帧转换成字符画

1ascii_frame23ascii_char ="$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^`'. "4567# 像素映射到字符89def pixelToChar(self, luminance):1011return self.ascii_char[int(luminance /256* len(self.ascii_char))]12131415# 将普通帧转为 ASCII 字符帧1617def convert(self, img, limitSize=-1, fill=False, wrap=False):1819if limitSize !=-1and(img.shape[0]> limitSize[1]or img.shape[1]> limitSize[0]):2021img = cv2.resize(img, limitSize, interpolation=cv2.INTER_AREA)2223ascii_frame =''2425blank =''2627if fill:2829blank +=' '*(limitSize[0]- img.shape[1])3031if wrap:3233blank +='n'3435for i in range(img.shape[0]):3637for j in range(img.shape[1]):3839ascii_frame += self.pixelToChar(img[i, j])4041ascii_frame += blank4243return ascii_frame

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

控制输出

1# 创建线程23getchar = threading.Thread(target=getChar)45# 设置为守护线程67getchar.daemon =True89# 启动守护线程1011getchar.start()1213# 输出的字符画行数1415rows = len(self.charVideo[0])// os.get_terminal_size()[0]1617for frame in self.charVideo:1819# 接收到输入则退出循环2021if breakflag:2223break2425self.streamOut(frame)2627self.streamFlush()2829time.sleep(self.timeInterval)3031# 共 rows 行,光标上移 rows-1 行回到开始处3233self.streamOut('

python篮球-用Python让蔡徐坤在我的命令行里打篮球!|附完整代码相关推荐

  1. python运行cmd命令和opencv搭建_Python让蔡徐坤在我的命令行里打篮球!

    原标题:Python让蔡徐坤在我的命令行里打篮球! 作者自称是一个经常逛 B 站的肥宅.最近 B 站上流行的视频素材除了"换脸",其次就要属"蔡xx打球"视频了 ...

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

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑ 来源 | 01二进制(ID:gh_d1999add1857) 编辑 | Jane [导语]作者自称是一个 ...

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

    作者自称是一个经常逛 B 站的肥宅.最近B站上流行的视频素材除了"换脸",其次就要属"蔡xx打球"视频了.有模仿的.对比的.手绘的... ...更过分的是,竟然 ...

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

    「2019 Python开发者日」倒计时三天,请扫码咨询 ↑↑↑ 作者 | 雇个城管打天下,理工男一枚.南京大学软件工程系硕士,一个还在做着拥有十万读者梦的互联网新人,或许一篇文章无法获得你的关注,但 ...

  5. python 把numpy.ndarray转为图像_Python 让蔡徐坤在我的命令行里打篮球?打得还不错...

    这是恋习Python推荐的第83篇好文 作者:顾个城管打天下 作者自称是一个经常逛 B 站的肥宅.最近 B 站上流行的视频素材除了"换脸",其次就要属"蔡xx打球&quo ...

  6. Python 让蔡徐坤在我的命令行里打篮球!| 技术头条

    作者 | 雇个城管打天下 责编 | 伍杏玲 本文经授权转载自01二进制(ID:gh_d1999add1857) [CSDN 编者按]作者自称是一个经常逛 B 站的肥宅.最近 B 站上流行的视频素材除了 ...

  7. Python 让蔡徐坤在我的命令行里打篮球!

    既然要开始做东西,首要的问题就是想好要怎么做,大家都知道视频是由一系列图片一帧一帧组成的,因此视频转字符动画最基本的便是图片转字符画. 在这里简单的说一下图片转字符画的原理:首先将图片转为灰度图,每个 ...

  8. 用Go让蔡徐坤在我的命令行里打篮球!附示例gif和完整代码

    github地址

  9. 【Python搞笑游戏】因蔡徐坤打篮球动作超火,被某程序员写成了一款游戏,画面美到不敢看,成功学到了精髓~(附源码免费)

    导语 之前网络最火的梗,非"C徐坤打篮球"莫属.个人感觉,只有多年前的"春哥纯爷们"堪与匹敌! 虽然说C徐坤打篮球是一个老梗了,但是确实非常搞笑,今天就跟着小编 ...

最新文章

  1. 视觉惯性SLAM:VINS-Mono
  2. 【C#|.NET】从控制反转(依赖注入)想到事件注入 (非AOP)
  3. fguillot json rpc_Hyperf 框架创建 JSON-rpc 服务
  4. 返回、取消与关闭的使用逻辑
  5. vld检测不输出_专业分享丨高频电刀的质量控制检测
  6. impdb导入oracle,impdp导入.dmp到oracle
  7. 理解 Memory barrier(内存屏障)【转】
  8. 《SEM长尾搜索营销策略解密》一一2.9 长尾,寻找蓝海的最好方式
  9. C++学习日记5——模板
  10. Android实战开发-Kotlin教程(组件篇 2.2)
  11. 【HUSTOJ】1054: 字符图形10-字母三角
  12. 【实验室设备管理系统SSM】
  13. 第一章、Android基础入门 - Android移动开发基础笔记
  14. 湖北移动M411A_ZN-S905L3AB-UWE5621DS原机制作语音线刷包
  15. Java中set.iterator()的用法;
  16. java实现png有损压缩
  17. vue-iview异步加载渲染树
  18. 变量名与变量地址的关系:
  19. 微服务架构与开源框架
  20. mysql数据库表更新_MySQL更新表数据

热门文章

  1. leetcode 349. Intersection of Two Arrays
  2. xadmin2 django 搭建学生系统 model层
  3. docker搭建harbor私有镜像库
  4. C语言指针数组和数组指针
  5. Apache Spark 2.2.0 中文文档 - GraphX Programming Guide | ApacheCN
  6. ECMAScript 6 学习笔记(一)
  7. Java NIO (五) 管道 (Pipe)
  8. 学习Ruby你需要了解的相关知识(rvm, gem, bundle, rake, rails等)
  9. 如何学习开源系统有感(一)
  10. a标签代替input[button]