目录
文本信息
视频有一帧一帧的画面构成,利用字符替代画面中的像素信息,就可以将视频转换为字符画的视频,本文将利用python库,对一段视频进行转换,将其转换为字符串展示的视频,本文在文章——Python将视频转换为全字符视频(含音频)的参考下完成。以下代码及原视频可以在我的github上找到
项目所用主要库
opencv ——参考文档
pillow——参考文档
re
视频转换的原理
将视频转换为字符画,原理是利用像素点信息将其映射到字符上,对于彩色视频,需要对其进行处理,将其转换为灰度视频,其转换原理为利用灰度值公式将彩色的RGB像素表示为灰度值。最后再利用ascii码,将灰度值映射为字符。
灰度转换公式
gray = 0.2126 * r + 0.7152 * g + 0.0722 * b
ascii码的列表
ascii_char = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. "
完整代码
import cv2
import time
import os
from PIL import Image,ImageFont,ImageDraw
from cv2 import VideoWriter,VideoWriter_fourcc,imread,resize
import re
#转换为字符画
class CharFrame:
ascii_char = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. "
# 像素映射到字符
def pixelToChar(self, luminance):
return self.ascii_char[int(luminance / 256 * len(self.ascii_char))]
# 将普通帧转为 ASCII 字符帧
def convert(self, img, limitSize=(),fill=False,wrap=False):
if limitSize != () and (img.shape[0] > limitSize[1] or img.shape[1] > limitSize[0]):
#对图像缩放到适合终端的大小
img = cv2.resize(img, limitSize, interpolation=cv2.INTER_NEAREST)
ascii_frame = ''
blan