通过python绘制华强买瓜的字符画视频的步骤详解
作者:微小冷 发布时间:2022-03-01 05:42:43
标签:python,华强买瓜,字符画,视频
已经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
完整代码
来源:https://blog.csdn.net/m0_37816922/article/details/121296343


猜你喜欢
- Logminer是每个Dba都应熟悉的工具,当一天由于用户的误操作你需要做不完全的恢复时,由于你无法确定这个操作是哪个时间做的,所以这对你的
- 先来看看基本的定义:channel是Go语言中的一个核心类型,可以把它看成管道。并发核心单元通过它就可以发送或者接收数据进行通讯,这在一定程
- 我就废话不多说了,大家还是直接看代码吧!import kerasimport numpy as npfrom keras.applicati
- Firefox 的 Jetpack 可以让我们很轻松地创建 Firefox 插件,仅通过已掌握的前端技能(HTML/CSS/JS),估计让人
- 函数:endswith()作用:判断字符串是否以指定字符或子字符串结尾,常用于判断文件类型相关函数:判断字符串开头 startswith()
- 解析来自各种来源和格式的时间序列信息pd.to_datetime( arg,#int, float, str, d
- 用Flask处理图片非常容易,这一篇学习一下图片的上传、下载及展示。还是以实例代码演示为主。首先,实现一个简单的上传(过程中未做任何处理,只
- 一、连接MYSQL格式: mysql -h主机地址 -u用户名 -p用户密码1、 连接到本机上的MYSQL。首先打开DOS窗口,然后进入目录
- 最近接了个项目,其中有需求是要实现摇一摇红包功能,在网上搜了好久,都没有找到源码,没办法,只有自动写了,下面小编把我的劳动成果分享给大家供大
- Elastic Security 为分析人员提供了预防,检测和响应威胁的手段。 该解决方案解决了SIEM,endpoint,威胁搜寻等安全用
- IIS报错:msxml3.dll (0x80070005)拒绝访问解决办法:Set objSrvHTTP =
- 本文实例讲述了python简单文本处理的方法。分享给大家供大家参考。具体如下:由于有多线程的影响,c++项目打印出来的时间顺序不一致,导致不
- 本文实例为大家分享了python3实现飞机大战的具体代码,供大家参考,具体内容如下以下是亲测Python飞机大战全部代码,在保证有pygam
- 使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(10W+),如何提高效率呢?在JDBC编程接口中Stateme
- 1.基本结构 create OR REPLACE PROCEDURE存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBE
- 本文实例为大家分享了JS实现京东快递单号查询的具体代码,供大家参考,具体内容如下<!DOCTYPE html><html
- 什么是可变/不可变对象不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份
- 本文实例讲述了Python实现简单拆分PDF文件的方法。分享给大家供大家参考。具体如下:依赖pyPdf处理PDF文件切分pdf文件使用方法:
- 强大的group by 代码如下:select stdname, isnull(sum( case stdsubject whe
- 前言一般从数据库或者是从日志文件读出的数据均带有时间序列,做时序数据处理或者实时分析都需要对其时间序列进行归类归档。而Pandas是处理这些