原标题:Python让蔡徐坤在我的命令行里打篮球!

作者自称是一个经常逛 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

读取视频:

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 += blank

return 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:

break

self.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一下就可以了。

小编整理的一整套系统的python学习教程从最基础的的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习的学习资料都有整理,送给每一位小伙伴, 有想学习python编程的,或是转行,或是大学生,还有工作中想提升自己能力的,正在学习的小伙伴欢迎加入学习。

加Q群:5563,70268(招募中)

责任编辑:

python运行cmd命令和opencv搭建_Python让蔡徐坤在我的命令行里打篮球!相关推荐

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

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

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

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

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

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

  4. Python图像处理,cv2模块,OpenCV实现人脸检测蔡徐坤

    前言 利用Python实现OpenCV实现人脸检测,废话不多说~ 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: cv2模块: 以及一些Python自带的模块. 环境搭建 ...

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 图片验证码把我逼成了人工智障
  2. linux nat软件,linux下nat的应用(转)
  3. DirectX 3D学习笔记(一)
  4. oracle12cnolog,oracle12c 服务占用内存太大,oracle调整内存解决方法
  5. java小程序扑克牌_用Java来写一个模拟斗地主发牌的小程序
  6. iOS之常用的正则表达式
  7. PAT (Advanced Level) 1140~1143:1140模拟 1141模拟 1142暴力 1143 BST+LCA
  8. 版本1.8.1Go安装以及语法高亮配置
  9. vscode 头文件包含问题_WSL+VSCode = Linux ?
  10. UTF8有BOM和无BOM
  11. perl里面隐式的继承
  12. Java笔记-Spring-rabbitmq中设置receiveMessage参数为Message
  13. Qt|C++工作笔记-对虚函数的进一步认识(关键是Qt中如何正确使用,达到想要的效果)
  14. CVPR 2019 CLIC 图像压缩挑战赛冠军方案解读
  15. 欧洲杯第一周的比赛闲聊
  16. 一个全栈工程师要掌握哪些技能
  17. 力扣题库63-不同路径II(C语言)
  18. android 手机 投影,100吋1080p 看Android双核手机连投影
  19. 在unity中更改天空盒的几种方式
  20. C语言中free函数如何确定释放的空间大小

热门文章

  1. 游戏差异更新—BSDiff算法解析
  2. 李宁卖咖啡,意欲何为?
  3. 掌纹与掌静脉融合matlab代码,一种基于人脸和掌纹掌静脉识别的身份比对方法与流程...
  4. 2017福建省计算机一级应用技术,2017年一级计算机信息技术及应用考试试题级答案...
  5. 64码高清电视 android版,爱直播tv版-爱直播v4.7.64 安卓智能电视版__西西安卓tv
  6. 一个自建的Java命令行解析参数类ArgumentsParser
  7. java的markword_【转帖】Java工具结构与锁实现原理及MarkWord详解
  8. oracle ebs 安装教程,Oracle EBS R12.1.1 安装及配置
  9. Multisim # 数字逻辑仿真实验一些基础的tips
  10. python爬取网店数据_如何爬虫天猫店铺数据python