字符画-Python
视频转字符动画-Python
# bad apple
步骤
将视频转化为一帧一帧的图片
把图片转化为字符画
按顺序播放字符画
一、准备
- 模块
opencv-python # 用来读取视频和图片
numpy # opencv-python 依赖于它
首先安装依赖:
pip3 install numpy opencv-python
然后新建python代码文档,在开头添加上下面的导入语句
import numpy as np
- 材料文件
材料就是视频文件了,我这里用的是在百度网盘提取的BadApple.mp4,
记得下载下来和python代码放到同一目录下
二、按帧读取视频
现在继续添加代码,实现第一步:按帧读取视频。
下面这个函数,接受视频路径和字符视频的尺寸信息,返回一个img列表,其中的img是尺寸都为指定大小的灰度图。
#导入 opencv
import cv2
def video2imgs(video_name, size):img_list = []# 从指定文件创建一个VideoCapture对象
cap = cv2.VideoCapture(video_name)# 如果cap对象已经初始化完成了,就返回true,换句话说这是一个 while true 循环
while cap.isOpened():# cap.read() 返回值介绍:# ret 表示是否读取到图像# frame 为图像矩阵,类型为 numpy.ndarry.ret, frame = cap.read()if ret:# 转换成灰度图,也可不做这一步,转换成彩色字符视频。gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# resize 图片,保证图片转换成字符画后,能完整地在命令行中显示。img = cv2.resize(gray, size, interpolation=cv2.INTER_AREA)# 分帧保存转换结果img_list.append(img)else:break# 结束时要释放空间
cap.release()return img_list
三、图像转化为字符画
视频转换成了图像,这一步便是把图像转换成字符画
下面这个函数,接受一个img对象为参数,返回对应的字符画。
用于生成字符画的像素,越往后视觉上越明显。。这是我自己按感觉排的,你可以随意调整。
pixels = " .,-'`:!1+*abcdefghijklmnopqrstuvwxyz<>()\/{}[]?234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ%&@#$"def img2chars(img):
res = []
""":param img: numpy.ndarray, 图像矩阵
:return: 字符串的列表:图像对应的字符画,其每一行对应图像的一行像素
"""# 要注意这里的顺序和 之前的 size 刚好相反
height, width = img.shape
for row in range(height):line = ""for col in range(width):# 灰度是用8位表示的,最大值为255。# 这里将灰度转换到0-1之间percent = img[row][col] / 255# 将灰度值进一步转换到 0 到 (len(pixels) - 1) 之间,这样就和 pixels 里的字符对应起来了index = int(percent * (len(pixels) - 1))# 添加字符像素(最后面加一个空格,是因为命令行有行距却没几乎有字符间距,用空格当间距)line += pixels[index] + " "res.append(line)return res
上面的函数只接受一帧为参数,一次只转换一帧,可我们需要的是转换所有的帧,所以就再把它包装一下:
def imgs2chars(imgs):video_chars = []for img in imgs:video_chars.append(img2chars(img))return video_chars
四、播放字符视频
把它封装成了一个函数。下面这个函数接受一个字符画的列表并播放。
import time
import subprocess
def play_video(video_chars):"""播放字符视频:param video_chars: 字符画的列表,每个元素为一帧:return: None"""# 获取字符画的尺寸width, height = len(video_chars[0][0]), len(video_chars[0])for pic_i in range(len(video_chars)):# 显示 pic_i,即第i帧字符画for line_i in range(height):# 将pic_i的第i行写入第i列。print(video_chars[pic_i][line_i])time.sleep(1 / 24) # 粗略地控制播放速度。subprocess.call("clear") # 调用shell命令清屏
写完后,开个shell,最大化窗口,然后找到代码文件(文件名换成你的)
python3 fx.py
可能要等很久。我使用1080p视频大概需要2分钟左右。
看到提示的时候,按回车,开始播放!
完整代码如下
import numpy as npimport cv2def video2imgs(video_name, size):img_list = []cap = cv2.VideoCapture(video_name)while cap.isOpened():ret, frame = cap.read()if ret:gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)img = cv2.resize(gray, size, interpolation=cv2.INTER_AREA)img_list.append(img)else:break
cap.release()
return img_listpixels = " .,-'`:!1+*abcdefghijklmnopqrstuvwxyz<>()\/{}[]?234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ%&@#$"def img2chars(img):res = []height, width = img.shapefor row in range(height):line = ""for col in range(width):percent = img[row][col] / 255index = int(percent * (len(pixels) - 1))line += pixels[index] + " "res.append(line)return resdef imgs2chars(imgs):video_chars = []for img in imgs:video_chars.append(img2chars(img))return video_charsimport time
import subprocessdef play_video(video_chars):width, height = len(video_chars[0][0]), len(video_chars[0])for pic_i in range(len(video_chars)):for line_i in range(height):print(video_chars[pic_i][line_i])time.sleep(1 / 24)subprocess.call("clear") if __name__ == "__main__":imgs = video2imgs("Bad Apple.mp4", (64, 48))video_chars = imgs2chars(imgs)input("`转换完成!按enter键开始播放")play_video(video_chars)
注意在shell窗口运行
字符画-Python相关推荐
- python canvas画弧度_超清字符画——Python代码
字符画视频如下,可以先预览一下效果(建议进入BILIBILI全屏观看): [樱花绽放]代码敲出武汉加油(全屏观看)期待战疫成功,武大赏樱_哔哩哔哩 (゜-゜)つロ 干杯~-bilibiliwww.b ...
- 图片转字符画(python)
记录 python图片转字符画 使用盲文字符 效果图: from PIL import ImageimgSrc = 'test.jpg' chars = list("⣿⣷⣾⢿⡾⣮⣭⣝⣫⣥⡛⣏ ...
- python画熊猫代码_超清字符画——Python代码
字符画视频如下,可以先预览一下效果(建议进入BILIBILI全屏观看):[樱花绽放]代码敲出武汉加油(全屏观看)期待战疫成功,武大赏樱_哔哩哔哩 (゜-゜)つロ 干杯~-bilibiliwww.bi ...
- 将普通图片转化为字符画(Python)
1.设计思路 如何把以.png的图片以不同字符把它形象的画出来呢? 我们知道其实一张图片是由很多不同像素点所组成的,每种像素点可以表示一种颜色.那么如果我们用不同的字符来代替各种像素点,是不是就可以将 ...
- python图像转字符画_Python实现图片转字符画的代码实例
如何利用Python实现图片转字符画详解 如何用python将图片转为字符画给小编你的心作纪念,小编的梦有你的祝福才能够完全,风浪再大,小编也会勇往直前,小编们的爱,镶在青春的纪念册. # codin ...
- python编辑视频字符化_Python 视频转字符画 - 进阶
这篇文章是 视频转字符动画-Python-60行代码 的后续,如果感兴趣,请先看看它. 0. 话说在前头 最新版使用了画布方式实现,和本文相比改动非常大,如果对旧版本的实现没啥兴趣,可以直接移步 vi ...
- 网页版 Python 图片转字符画
原文:https://lwebapp.com/zh/post/python-image-to-ascii 需求 最近发现一个好玩的 Python 玩法,用 Python 将图片转为字符画,大多数都是本 ...
- python笔记手写照片_Python笔记-将图片转换为字符画
[功能] 将jpg图片转换为字母画字符画( python 3.7版本下调试成功) [特点] 1.图片可默认位置,或者手工输入指定图片名 2.输出字符画高度可以设置,默认为60行 图片转字符画程序.jp ...
- 基于Python实现图画转换字符画
微信改版,加星标不迷路! 基于Python实现图画转换字符画 作者:阿广 概述 前言 准备工作 识别原理 静态图像处理 动态图像处理 结果 阿广说 群聊交流 福利一刻 推荐阅读 前言 前几天写了基于P ...
- Python趣味编程小技巧,图片转炫酷字符画,一看就是高手
hello大家好,今天我又发现了个有趣的小玩意.我是专写有趣小玩意的老师. 老规矩,先上效果图 今天做这个图片转字符画是用到了pil库.这是一个专门用来处理图片的python库.自己直接用pip安装下 ...
最新文章
- MySQL的八股文自述(持续更新)
- kali使用openvas
- python简单代码input-【python系统学习05】input函数——实现人机交互
- gcc动态链接库基本知识
- 制作作品图片_不懂人文后期制作流程?来,大师手把手教你
- 跨平台异步IO库 libuv 源代码接口详解
- linux中文输入法 ibus
- css中绝对定位与相对定位的区别
- SQL:postgresql点geom转换为经纬度、POINT
- 单片机 LCD1602液晶显示
- lammps运行Linux,Lammps安装教程
- CAD如何绘制六连环图案?CAD使用圆,椭圆,直线综合练习
- [work] 清华朱军 NIPS 2017对抗样本攻防竞赛总结(附学习资料)
- web多媒体技术在视频编辑场景的应用
- 职场学做“功夫熊猫”
- Dota 游戏中的攻击与伤害分析
- 阿里云 ECS 构建集群
- Win10 平板 关闭屏幕不休眠 平板电源键 锁屏 程序
- WSFederation 身份验证模块概述
- 案例-站狼云品智美站助力必信空调中国制造领先品牌