python绘制字符画视频的示例代码

 更新时间:2021年11月14日 11:01:20   作者:微小冷  
网上有很多的字符画,看起来很炫酷,本文就通过一则示例实现字符画视频,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

已经11月了,不知道还有没有人看华强买瓜。。。要把华强卖瓜做成字符视频,总共分为三步

  • 读取视频
  • 把每一帧转为字符画
  • 把字符画表现出来

 读取视频

通过imageio读取视频,除了pip install imageio之外,还需要pip install imageio-ffmpeg

由于视频中的图像都是彩色的,故而需要将rgb三色转为单一的强度,并将转化后的图像装入一个列表中。

import imageio
import numpy as np
import matplotlib.pyplot as plt
video = imageio.get_reader('test.mp4')
imgs = []
for img in video:
    imgs.append(np.mean(img,2))
plt.imshow(imgs[0])
plt.show()

在这里插入图片描述

转为字符

这个视频虽然已被压缩,但对于字符画而言还是太大了,所以转字符画之前需对其进一步压缩。这里采取最简单的方法——即对相邻的像素取平均值。

#将图像宽度缩小至width
from itertools import product   #用于循环嵌套
def resizeImg(img,w,h=None):
    m,n = img.shape
    if n<w:
        return img
    if not h:
        h = int(m*w/n)
    im = np.zeros([h,w])
    rw,rh = n/w,m/h         #缩放比例
    dw,dh = int(rw),int(rh) #取均值的步长
    for i,j in product(range(h),range(w)):
        I,J = int(i*rh),int(j*rw)
        im[i,j] = np.mean(img[I:I+dh,J:J+dw])
    return im
# 测试一下
im = resizeImg(imgs[0],160)
plt.imshow(im)
plt.show()

在这里插入图片描述

接下来,就可以生成字符画了,所谓字符画,无非是将像素值映射成一个字符,方法非常简单

pixels = "▇圞國图囜ⒶⒷⒸB8&WMZO0QJX@%&jfoavunxr#t/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ^`'. " #用于映射的字符
def im2txt(img):
    im = np.floor(img/255*len(pixels)).astype(int)
    txts = ""
    for line in im:
        txts += "".join([pixels[i] for i in line])
        txts += '\r\n'    #像素换行时文本也要换行
    return txts
#测试
txt = im2txt(im)
print(txt)

结果如下

在这里插入图片描述

动画

让命令行绘制字符视频,听上去可能有些不可思议,但这个功能可以仅凭python内置的模块实现——即curses,唯一可惜的是,Windows下的Python并不内置这个模块,需要额外安装。

先下载和自己python版本相符的curses,然后通过pip命令安装

>pip install "curses-2.2.1+utf8-cp310-cp310-win_amd64.whl"

然后就可以在python中调用了。由于视频太大,所以这里只演示一小段,效果如下

在这里插入图片描述

主程序的代码如下

if __name__ == "__main__":
    video = imageio.get_reader('test.mp4')
    txts = []
    # 生成字符画
    for img in video:
        im = resizeImg(np.mean(img,2),120,30)
        txts.append(im2txt(im))

    # 初始化屏幕
    scr = curses.initscr()
    scr.timeout(40)     #每次等待键盘输入的时间为40ms
    #scr.
    for txt in cycle(txts):
        scr.addstr(0,0,txt)
        scr.border(0)
        scr.refresh()
        #curses.delay_output(25)
        if scr.getch()==27: #如果按下`esc`则退出`
            break

到此这篇关于python绘制字符画视频的示例代码的文章就介绍到这了,更多相关python 字符画视频内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python实现自动玩连连看的脚本分享

    Python实现自动玩连连看的脚本分享

    最近女朋友在玩连连看,玩了一个星期了还没通关,真的是菜。实在是看不过去了,直接用python写了个脚本代码可以自动玩连连看,感兴趣的可以了解一下
    2022-04-04
  • 清理pip和conda缓存的方法示例

    清理pip和conda缓存的方法示例

    本文主要介绍了清理pip和conda缓存的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03
  • Python实现随机从图像中获取多个patch

    Python实现随机从图像中获取多个patch

    经常有一些图像任务需要从一张大图中截取固定大小的patch来进行训练。本文就来和大家聊聊如何用Python实现随机从图像中获取多个patch,感兴趣的可以了解一下
    2022-08-08
  • 使用pytorch 筛选出一定范围的值

    使用pytorch 筛选出一定范围的值

    这篇文章主要介绍了使用pytorch 筛选出一定范围的值,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • python实现用于测试网站访问速率的方法

    python实现用于测试网站访问速率的方法

    这篇文章主要介绍了python实现用于测试网站访问速率的方法,涉及Python中urllib2模块及时间的相关操作技巧,需要的朋友可以参考下
    2015-05-05
  • python__new__内置静态方法使用解析

    python__new__内置静态方法使用解析

    这篇文章主要介绍了python__new__内置静态方法使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 浅谈Python中的生成器和迭代器

    浅谈Python中的生成器和迭代器

    这篇文章主要介绍了Python中的生成器和迭代器的的相关资料,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • Python操作SQLite/MySQL/LMDB数据库的方法

    Python操作SQLite/MySQL/LMDB数据库的方法

    这篇文章主要介绍了Python操作SQLite/MySQL/LMDB数据库的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • Python实现文件下载、Cookie以及重定向的方法代码

    Python实现文件下载、Cookie以及重定向的方法代码

    本文主要介绍了如何使用 Python 的 requests 模块进行网络请求操作,涵盖了从文件下载、Cookie 处理到重定向与历史请求等多个方面,通过详细的示例代码,展示了如何高效地实现各种网络操作,帮助开发者更轻松地进行 HTTP 请求的处理和数据管理
    2025-02-02
  • 深入理解NumPy简明教程---数组3(组合)

    深入理解NumPy简明教程---数组3(组合)

    本篇文章对NumPy数组进行较深入的探讨。首先介绍自定义类型的数组,接着数组的组合,最后介绍数组复制方面的问题,有兴趣的可以了解一下。
    2016-12-12

最新评论