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

作者:微小冷 时间:2023-11-09 16:21:46 

已经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()

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

转为字符

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


#将图像宽度缩小至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()

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

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


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绘制字符画视频的示例代码

动画

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

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


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

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

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

标签:python,字符画,视频
0
投稿

猜你喜欢

  • 创建pycharm的自定义python模板方法

    2021-01-11 04:46:41
  • Python使用ElementTree美化XML格式的操作

    2022-03-11 05:11:20
  • 解决mysql 1040错误Too many connections的方法

    2024-01-24 06:56:58
  • Windows10下Tensorflow2.0 安装及环境配置教程(图文)

    2022-03-31 04:02:28
  • 使用 createProcessingInstruction 方法不能输出 encoding 的解决方法

    2009-03-10 18:22:00
  • 对Python中plt的画图函数详解

    2023-08-16 08:49:07
  • Virtualenv 搭建 Py项目运行环境的教程详解

    2023-02-22 04:56:33
  • python面向对象之类的继承详解

    2022-03-20 18:22:22
  • Python获取时间范围内日期列表和周列表的函数

    2023-03-25 15:16:39
  • 详解如何使用Pyecharts制作Map3D

    2023-06-06 21:31:58
  • SQL Server误区30日谈 第7天 一个实例多个镜像和日志传送延迟

    2024-01-16 19:01:01
  • Window 64位下python3.6.2环境搭建图文教程

    2023-07-26 02:22:45
  • MySQL数据库命令

    2024-01-17 09:27:22
  • Python使用pymongo模块操作MongoDB的方法示例

    2023-03-26 08:58:46
  • 在Django的URLconf中进行函数导入的方法

    2023-07-10 10:46:26
  • 记录Python脚本的运行日志的方法

    2022-09-25 08:11:12
  • Python实现截屏的函数

    2022-03-12 01:46:53
  • 看看如何用Python绘制小米新版天价logo

    2023-04-09 06:01:10
  • Python编程应用设计原则详解

    2021-04-08 20:13:05
  • 网页特效文字之—压纹字

    2023-06-26 19:30:06
  • asp之家 网络编程 m.aspxhome.com