python绘制字符画视频的示例代码
作者:微小冷 发布时间:2023-11-09 16:21:46
标签: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
0
投稿
猜你喜欢
- 在工作中遇到把DataGrid中绑定的后台数据库数据展示给用户时把负数变为0的小问题,现在记录下来。例子中数据表示这个样子的:-------
- 代码已经调通,跑出来的效果如下:# coding=gbkimport torchimport matplotlib.pyplot as pl
- 划动门菜单技术:运行代码框<style>body {font-size:12px;font-family:宋体}ul.TabBa
- 当你使用UPDATE, INSERT, DELETE语句更新数据的时候,你就改变了两个地方的数据:log buffer和data buffe
- Go 互斥锁的实现原理?Go sync包提供了两种锁类型:互斥锁sync.Mutex 和 读写互斥锁sync.RWMutex,都属于悲观锁。
- 现在的离线浏览器很多,可是多数都是共享软件,或是英文软件,这给我们的操作带来了很大的不便。其实微软的网页制作工具FrontPage XP有一
- 本文实例讲述了Python实现从订阅源下载图片的方法。分享给大家供大家参考。具体如下:这段代码是基于python 3.4实现的,和pytho
- 前言:Matplotlib 通常与 NumPy、Pandas 一起使用,是数据分析中不可或缺的重要工具之一。Matplotlib 是 Pyt
- 本文实例讲述了PHP中substr_count()函数获取子字符串出现次数的方法。分享给大家供大家参考,具体如下:PHP中的substr_c
- 换脸!这段时间,deepfakes搞得火热,比方说把《射雕英雄传》里的朱茵换成了杨幂,看下面的图!毫无违和感!其实早在之前,基于AI换脸的技
- Python:获取“ 3年前的今天”的日期时间Python: get datetime for
- 问题:MySQL某个表自增id溢出导致某业务block背景: tokudb引擎的一个大表tb1,存放业务
- OpenCV的作用及安装OpenCV简介OpenCV是一个开源的跨平台计算机视觉库,可以运行在Linux、Windows、Android和M
- 新建一个项目 app02在 app02/ 下创建 urls.py:from django.conf.urls import urlfrom
- 前言如何通过python实现邮件解析?邮件的格式十分复杂,主要是mime协议,本文主要是从实现出发,具体原理可以自行研究。一、安装通过mai
- 这个问题已经不是什么新鲜问题了,网上也有大把的教程,但大多数是授人以鱼,而不授人以渔,经过辛苦的资料收集,思考,调试,整理,我基本上已经把这
- 主要问题为什么argv中第一个,即index=0的内容就是文件名?python中argc是用什么实现的?概念解释argc:argument
- 今天同事 明城 在项目中碰到一个 BUG,代码具体如下:<!DOCTYPE html PUBLIC "-//W3C//DTD
- 介绍go-redis和redigo底层是通过调用的万能 Do 方法实现, 但是redigo:由于输入是万能类型所以必须记住每个命令的参数和返
- 又忙忙碌碌的的过了一个月,但都在瞎忙,忙得没有一点效率也没有一点价值。忙完之后静下来我就在想,这种情况要持续到什么时候是个头啊~~~网站是一