视频转字符动画-Python

# bad apple

步骤
将视频转化为一帧一帧的图片
把图片转化为字符画
按顺序播放字符画

一、准备

  1. 模块
    opencv-python # 用来读取视频和图片
    numpy # opencv-python 依赖于它

首先安装依赖:
pip3 install numpy opencv-python

然后新建python代码文档,在开头添加上下面的导入语句
import numpy as np

  1. 材料文件
    材料就是视频文件了,我这里用的是在百度网盘提取的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相关推荐

  1. python canvas画弧度_超清字符画——Python代码

    字符画视频如下,可以先预览一下效果(建议进入BILIBILI全屏观看): [樱花绽放]代码敲出武汉加油(全屏观看)期待战疫成功,武大赏樱_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.b ...

  2. 图片转字符画(python)

    记录 python图片转字符画 使用盲文字符 效果图: from PIL import ImageimgSrc = 'test.jpg' chars = list("⣿⣷⣾⢿⡾⣮⣭⣝⣫⣥⡛⣏ ...

  3. python画熊猫代码_超清字符画——Python代码

    字符画视频如下,可以先预览一下效果(建议进入BILIBILI全屏观看):[樱花绽放]代码敲出武汉加油(全屏观看)期待战疫成功,武大赏樱_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bi ...

  4. 将普通图片转化为字符画(Python)

    1.设计思路 如何把以.png的图片以不同字符把它形象的画出来呢? 我们知道其实一张图片是由很多不同像素点所组成的,每种像素点可以表示一种颜色.那么如果我们用不同的字符来代替各种像素点,是不是就可以将 ...

  5. python图像转字符画_Python实现图片转字符画的代码实例

    如何利用Python实现图片转字符画详解 如何用python将图片转为字符画给小编你的心作纪念,小编的梦有你的祝福才能够完全,风浪再大,小编也会勇往直前,小编们的爱,镶在青春的纪念册. # codin ...

  6. python编辑视频字符化_Python 视频转字符画 - 进阶

    这篇文章是 视频转字符动画-Python-60行代码 的后续,如果感兴趣,请先看看它. 0. 话说在前头 最新版使用了画布方式实现,和本文相比改动非常大,如果对旧版本的实现没啥兴趣,可以直接移步 vi ...

  7. 网页版 Python 图片转字符画

    原文:https://lwebapp.com/zh/post/python-image-to-ascii 需求 最近发现一个好玩的 Python 玩法,用 Python 将图片转为字符画,大多数都是本 ...

  8. python笔记手写照片_Python笔记-将图片转换为字符画

    [功能] 将jpg图片转换为字母画字符画( python 3.7版本下调试成功) [特点] 1.图片可默认位置,或者手工输入指定图片名 2.输出字符画高度可以设置,默认为60行 图片转字符画程序.jp ...

  9. 基于Python实现图画转换字符画

    微信改版,加星标不迷路! 基于Python实现图画转换字符画 作者:阿广 概述 前言 准备工作 识别原理 静态图像处理 动态图像处理 结果 阿广说 群聊交流 福利一刻 推荐阅读 前言 前几天写了基于P ...

  10. Python趣味编程小技巧,图片转炫酷字符画,一看就是高手

    hello大家好,今天我又发现了个有趣的小玩意.我是专写有趣小玩意的老师. 老规矩,先上效果图 今天做这个图片转字符画是用到了pil库.这是一个专门用来处理图片的python库.自己直接用pip安装下 ...

最新文章

  1. MySQL的八股文自述(持续更新)
  2. kali使用openvas
  3. python简单代码input-【python系统学习05】input函数——实现人机交互
  4. gcc动态链接库基本知识
  5. 制作作品图片_不懂人文后期制作流程?来,大师手把手教你
  6. 跨平台异步IO库 libuv 源代码接口详解
  7. linux中文输入法 ibus
  8. css中绝对定位与相对定位的区别
  9. SQL:postgresql点geom转换为经纬度、POINT
  10. 单片机 LCD1602液晶显示
  11. lammps运行Linux,Lammps安装教程
  12. CAD如何绘制六连环图案?CAD使用圆,椭圆,直线综合练习
  13. [work] 清华朱军 NIPS 2017对抗样本攻防竞赛总结(附学习资料)
  14. web多媒体技术在视频编辑场景的应用
  15. 职场学做“功夫熊猫”
  16. Dota 游戏中的攻击与伤害分析
  17. 阿里云 ECS 构建集群
  18. Win10 平板 关闭屏幕不休眠 平板电源键 锁屏 程序
  19. WSFederation 身份验证模块概述
  20. 案例-站狼云品智美站助力必信空调中国制造领先品牌

热门文章

  1. java涂色_【LeetCode(Java) - 276】栅栏涂色
  2. 动态范围控制算法基本原理
  3. [C# Fundamantal] 类继承简析
  4. h5 php捕鱼,完整的html5捕鱼游戏源码分享
  5. 车辆运动学自行车模型
  6. 新出台的治理iMessage垃圾短信的规则
  7. Mac系统如何显示隐藏文件
  8. P4官方实验4. Explicit congestion notification
  9. B站小甲鱼Python基础学习课堂笔记
  10. mac os模拟器linux,获取Mac OS 8模拟器并重新体验Macintosh 90s