这是恋习Python推荐的第83篇好文

作者:顾个城管打天下

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

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

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

原理

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

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

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

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

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

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

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

这次实验使用到的核心的库是OpenCV-Python

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

实验

实验开始前我们需要安装 OpenCV-Python 的包:

pip install opencv-python

读取视频:

def genCharVideo(self, filepath):self.charVideo =[]# 用opencv读取视频
cap = cv2.VideoCapture(filepath)self.timeInterval = round(1/ cap.get(5),3)
nf = int(cap.get(7))
print('Generate char video, please wait...')for i in pyprind.prog_bar(range(nf)):# 转换颜色空间,第二个参数是转换类型,cv2.COLOR_BGR2GRAY表示从BGR↔Gray
rawFrame = cv2.cvtColor(cap.read()[1], cv2.COLOR_BGR2GRAY)
frame = self.convert(rawFrame, os.get_terminal_size(), fill=True)self.charVideo.append(frame)
cap.release()

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

将帧转换成字符画

ascii_frame
ascii_char ="$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. "# 像素映射到字符def pixelToChar(self, luminance):return self.ascii_char[int(luminance /256* len(self.ascii_char))]# 将普通帧转为 ASCII 字符帧def convert(self, img, limitSize=-1, fill=False, wrap=False):if limitSize !=-1and(img.shape[0]> limitSize[1]or img.shape[1]> 
    limitSize[0]):
    img = cv2.resize(img, limitSize, 
    interpolation=cv2.INTER_AREA)
    ascii_frame =''
    blank =''if fill:
   blank +=' '*(limitSize[0]- img.shape[1])if wrap:
   blank +='\n'for i in range(img.shape[0]):for j in range(img.shape[1]):
      ascii_frame += self.pixelToChar(img[i, j])
      ascii_frame += blankreturn ascii_frame

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

控制输出

# 创建线程
getchar = threading.Thread(target=getChar)# 设置为守护线程
getchar.daemon =True# 启动守护线程
getchar.start()# 输出的字符画行数
rows = len(self.charVideo[0])// os.get_terminal_size()[0]for frame in self.charVideo:# 接收到输入则退出循环if breakflag:breakself.streamOut(frame)self.streamFlush()
    time.sleep(self.timeInterval)# 共 rows 行,光标上移 rows-1 行回到开始处self.streamOut('\033[{}A\r'.format(rows -1))# 光标下移 rows-1 行到最后一行,清空最后一行self.streamOut('\033[{}B\033[K'.format(rows -1))# 清空最后一帧的所有行(从倒数第二行起)for i in range(rows -1):# 光标上移一行self.streamOut('\033[1A')# 清空光标所在行self.streamOut('\r\033[K')if breakflag:self.streamOut('User interrupt!\n')else:self.streamOut('Finished!\n')

执行

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

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

源码:

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

提取码: jc3n

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. python爬虫爬取b站_python爬虫11 | 这次,将带你使用python爬取b站上的NBA形象大使蔡徐坤和他的球友们-Go语言中文社区...

    在上一篇中 小帅b给大家透露了我们这篇要说的牛逼利器 selenium + phantomjs 如果你看了 那么你应该知道 selenium 是什么了 它能做到自动操作 比如我们上次说的自动百度苍老师 ...

  9. python里的resize_Python玩转蔡徐坤

    很无聊地做了一个视频转字符图的Python代码,把最近火的一趟糊涂的蔡徐坤转成字符图像. 效果可以看这里 https://www.bilibili.com/video/av50295619/​www. ...

最新文章

  1. “我只需一个周末就可以构建出这个应用!”
  2. python【蓝桥杯vip练习题库】ADV-104打水问题
  3. python在线读-python初级实战-----主机在线情况监控web
  4. rock-paper-scissors
  5. 判断一个IP是否归属于中国
  6. 浅谈基于TCP和UDP的协议设计
  7. Object-C中方法
  8. SpringBoot集成MyBatis-Plus框架
  9. 用 普通 用户欺骗登陆 获取 管理员的最高权限~~~~
  10. UVA 10555 - Dead Fraction(数论+无限循环小数)
  11. python输入流和输出流_Python 初体验之 输入输出流
  12. 今天预计有多少人买饭团?李彦宏说百度用PaddlePaddle给答案
  13. HYSBZ 2145 悄悄话
  14. 获取ASP.NET MVC中的完整操作URL [重复]
  15. python爬虫框架
  16. DocumentFragment文档碎片(高效批量更新多个节点)
  17. 京东联盟API-二合一链接转链接口-线报转链-京粉转链接口
  18. (学习笔记)读取PDF/OFD文件
  19. 虚函数表构成、地址详细说明
  20. 12级计算机动画制作专业,计算机专业技术12级是什么意思?

热门文章

  1. 新建MVC项目与发布
  2. 大班音乐机器人反思_大班音乐教案:机器人教案及教学反思
  3. 7-13 简单计算器 (25 分)
  4. linux用户群组实验总结,linux基础概念和个人笔记总结(2)——账号和权限管理实验验证...
  5. 微信小程序制作课程表_课表微信小程序实现(纯技术文)
  6. 力扣206-反转链表(Java,迭代)
  7. 北林oj-算法设计与分析-Don‘t touch my cake(题意+代码)
  8. VMware关闭虚拟机系统后不见了
  9. 关于request.getServletPath(),request.getContextPath()的总结
  10. 鸿蒙os事例代码,鸿蒙HarmonyOS App开发造轮子之自定义圆形图片组件的实例代码