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

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

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

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

Python学习交流群:1004391443

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

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

Python 让蔡徐坤在我的命令行里打篮球!相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    github地址

  9. python篮球-用Python把蔡徐坤打篮球视频转换成字符动画!

    原标题:用Python把蔡徐坤打篮球视频转换成字符动画! 说到现在网络最火的梗,非"蔡徐坤打篮球"莫属.最近,蔡徐坤当仁不让地成为了娱乐圈被黑的最惨的明星. 自从2019年1月份, ...

最新文章

  1. 我身边那些逃离深圳的朋友们
  2. 你的团队能通过电梯测试吗?
  3. 周四话分析:数据驱动,如何塑造下一个“教育领头羊”?
  4. Kali更新源 - 由于没有公钥,无法验证下列签名: NO_PUBKEY ED444FF07D8D0BF6
  5. Linux CentOS安装zsh插件提示/usr/bin/env: python: No such file or directory。
  6. 怎么利用计算机计算潮流计算,电力系统潮流计算的目的是什么
  7. ubuntu安装nvidia显卡驱动+cuda9.0+cudnn7.0+查看cuda版本+安装tensorrt+python查看gpu显存
  8. java那一年出来的_输入某年某月某日 判断其是那一年的第多少天
  9. PCL之点特征直方图(PFH)
  10. Android调用.net的webservice服务器接收参数为空的情况
  11. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---11
  12. js页面跳转 和 js打开新窗口 方法 【转】
  13. C#如何连接带密码的access数据库?
  14. 群发邮件避免被识别为垃圾邮件
  15. python编程用什么软件-python用什么软件编写
  16. mysql数据库安全开关_对MySQL数据库的安全进行的详述
  17. 爬取实习僧并进行数据可视化
  18. wangEditor 粘贴从 word 复制的带图片内容的最佳实践
  19. Newton tangent method
  20. 不惧严寒的涩北“特种兵”

热门文章

  1. Softmax激活函数
  2. easypoi导出word文档(文本,表格)
  3. 186、商城业务-检索服务-页面分页数据渲染
  4. 2019智能手表推荐_2019智能手表推荐排行榜前三名top!
  5. C:勇敢羊羊不怕困难!2022-2023年度第四届全国大学生算法设计与编程挑战赛(秋季赛)之羊驼
  6. 阿里云凌晨回应故障:已全部恢复 将尽快赔偿
  7. 越狱Season 1-Episode 14: The Rat
  8. 关心国事-周鸿祎离开雅虎真相 自称土鳖更喜欢创业
  9. 生而为人,我很抱歉!深夜爬虫, 我很抱歉 ,附微信 “ 网抑云” 公众号爬虫教程!
  10. Psychtoolbox刺激呈现方式