资讯专栏INFORMATION COLUMN

超不清视频播放器-用Python将视频转成字符

DobbyKim / 1610人阅读

摘要:一幅图像全部转成字符序列后,就可以直接在控制台输出了。读取视频使用了,并直接用它提供的方法转了灰度图,在之前的文章中也有过介绍,计算机视觉开发利器这一步比较重要,因为有的视频分辨率很高,直接一个像素转一个字符的话量太大,所以先缩小图片。

今天分享的这段代码,看起来没啥实际用处,而且有些反潮流,因为现如今大家看视频都追求更高分辨率的超清画质,而我们这个,是 一个“超不清”的视频播放器

在控制台里播放视频,用字符来表示画面

不过我觉得它至少可以有三个作用:1.用来 练习视频和图像处理 的编程开发;2. 在没有图形界面的服务器上播放视频 (虽然效果不咋地);3.作为一种独特的 艺术风格化 处理

程序的原理其实很简单,关键是你要理解 计算机中一张图像的组成:一堆像素点。 我们平常说的 1920*1080 之类的分辨率,也就是指这个像素点的多少。我们想做成字符画,也就是考虑如何用不同的字符来表示一个像素。

通常 一个像素点由3个0~255的值表示 ,分别表示 红、绿、蓝三种颜色值 ,值越大表示颜色越深。但字符画是没有颜色的,所以需要将图像 转成灰度图 ,这样就可以跟一组从深到浅的字符形成一种对应关系。比如深的点就是 @,浅色的点就是 .。

一幅图像全部转成字符序列后,就可以直接在控制台输出了。对于一个视频来说,只需要将每一帧都转换后输出,并按照一定的时间间隔清屏、输出下一帧,即可达到我们的需要的效果。

转换后的效果:

代码:


# coding: utf8
import cv2 as cv
import os
import time
# 替换字符列表
ascii_char = list(r"$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^`". ")
char_len = len(ascii_char)
# 加载视频
cap = cv.VideoCapture("video.mp4")
while True:
    # 读取视频每一帧
    hasFrame, frame = cap.read()
    if not hasFrame:
        break
    # 视频长宽
    width = frame.shape[0]
    height = frame.shape[1]
    # 转灰度图
    img_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    # 缩小图片并调整长宽比
    img_resize = cv.resize(img_gray, (int(width / 10), int(height / 10)))

    text = ""
    # 遍历图片中的像素
    for row in img_resize:
        for pixel in row:
            # 根据像素值,选取对应的字符
            text += ascii_char[int(pixel / 256 * char_len)]
        text += "
"
    # 清屏
    os.system("cls")  # mac是"clear"
    # 输出生成的字符方阵
    print(text)
    # 适当暂停一下
    time.sleep(0.03)

代码不长,稍微解释下其中几处:

ascii_char 这个字符序列并不是必须这样,只要大致上满足其中的 字符看起来从深到浅 即可,字符越多越准确,效果就越好。

读取视频使用了 opencv-python ,并直接用它提供的方法转了灰度图,在之前的文章中也有过介绍:OpenCV-Python,计算机视觉开发利器

resize 这一步比较重要,因为有的视频分辨率很高,直接一个像素转一个字符的话量太大,所以 先缩小图片 。另一个原因是字符一般都不是正方形,所以在 图片长宽比上要做一定的调整 ,这样最终效果比较好。(实际中要根据你自己控制台中的字体效果来调整缩放比例)

ascii_char[int(pixel / 256 * char_len)] 是整个转换的核心,因为一个像素的颜色范围是 0~255,通过 pixel / 256 * char_len 可以 将一个像素值对应于字符序列中灰度相当的字符

关于输出,有几个值得注意的点: 输出一帧前需要清屏 ,不同平台命令有区别; 时间间隔、控制台的字体大小、缩放比例都要根据实际情况作调整 ;如果计算时间过长、刷新太慢而屏幕闪烁,可以考虑进一步缩小图片,或者先将所以帧转换完毕后再统一输出。

最后请各位欣赏最终的视频效果:

《极乐净土》字符版 https://www.zhihu.com/video/1063899647084568576

文中完整代码已上传,包括 转单张图片转视频 两份代码。
获取地址请在公众号“ Crossin的编程教室 ”里回复关键字 播放器

════

其他文章及回答:

如何自学Python | 新手引导 | 精选Python问答 | Python单词表 | 人工智能 | 爬虫 | 我用Python | requests | 计算机视觉

欢迎搜索及关注公众号: Crossin的编程教室

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42928.html

相关文章

  • video在微信和QQ浏览器中不全屏播放解决

    摘要:在网上看到好论坛类似的基本问题,以前有申请白名单的,在白名单的视频链接或者腾讯旗下的视频链接是原生播放,否则安卓会被劫持成腾讯家的播放器播放并且默认全屏,目前通过白名单的方法是解决不了的。 最近公司做一个视频活动的HTML5页面,页面并不复杂,但是要求视频播放的时候不全屏。在网上看到好论坛类似的基本问题,以前有申请白名单的,在白名单的视频链接或者腾讯旗下的视频链接是原生播放,否则安卓会...

    zr_hebo 评论0 收藏0
  • 码神军训(四,五)——代码跳舞军体拳

    摘要:吹水今天,码神依旧凉爽,军体拳,摸鱼一天,所以早上就在操场趴着,不过,我学会了,信不信看到抖音小姐姐的舞蹈,用代码做出来,还挺好看,我也想试一下,不会,学莫,反正假酒已经醒了。 ...

    mayaohua 评论0 收藏0
  • 关于 video 播放的新探索

    摘要:使用标签这是关于给出的基本用例。其实我们也是在这种背景下研究出来新的技术问题解决清晰度无缝切换的。这样之前说的所有成本问题都不存在,还能做到相同体验的无缝切换。所有代码来自带解析器能节省流量的西瓜播放器 前端同学要使用 HTML5 播放器视频,必然会使用 video 标签,不过大多数同学只是使用了较简单的功能,其实它本身拥有不凡之力有待我们发现。 首先,我们先来看下 video 最基础...

    Shihira 评论0 收藏0

发表评论

0条评论

DobbyKim

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<