昨晚我在网上看到了别人做的视频转字符动画,觉得很厉害,我于是也打算玩玩。今天中午花时间实现了这样一个小玩意。
顺便把过程记录在这里。
1.源视频:https://docs.qq.com/doc/DU3pabWFhWGpXWW5h
2.转换后:
步骤
1、将视频转化为一帧一帧的图片
2、把图片转化为字符画
3、按顺序播放字符画
一、准备
1、模块
这个程序需要用到这样几个模块:
1. opencv-python #用来读取视频和图片
2. numpy # opencv-python依赖于它
准备阶段,首先安装依赖: .
pip3 install numpy opencv-python
然后新建python代码文档,在开头添加上下面的导入语句
#-*- coding:utf-8 -*-
# numpy 是一个矩阵运算库,图像处理需要用到。
import numpy as np
2、材料
材料就是需要转换的视频文件了,下载下来和代码放到同一目录下,你也可以换成自己的,建议是学习时尽量选个短一点的视频,几十秒就行了,不然调试起来很痛苦。(或者自己稍微修改一下函数,只转换一定范围、一定数量的帧。)此外,要选择对比度高的视频。否则的话,就需要彩色字符才能有足够好的表现,有时间我试试。
二、按帧读取视频
现在继续添加代码,实现第一步:按帧读取视频。
下面这个函数,接受视频路径和字符视频的尺寸信息,返回一个img列表,其中的img是尺寸都为指定大小的灰度图。
#导入 opencv
import cv2
def video2imgs(video_name, size):
"""
:param video_name: 字符串, 视频文件的路径
:param size: 二元组,(宽, 高),用于指定生成的字符画的尺寸
:return: 一个 img 对象的列表,img对象实际上就是 numpy.ndarray 数组
"""
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)
# 分帧