python 制作字符视频_20行Python代码实现视频字符化功能

本文介绍了如何使用Python和OpenCV库,仅用20行代码实现视频字符化过程,包括图片读取、灰度处理、尺寸调整、字符映射与替换,以及视频帧的逐帧字符化。通过实例演示,教你如何创建独特的字符视频效果,并提供字符选择和颜色处理建议。
摘要由CSDN通过智能技术生成

我们经常在B站上看到一些字符鬼畜视频,主要就是将一个视频转换成字符的样子展现出来。看起来是非常高端,但是实际实现起来确是非常简单,我们只需要接触opencv模块,就能很快的实现视频字符化。但是在此之前,我们先看看我们实现的效果是怎样的:

82150a3e3a19f35b8ff6453086de203a.gif

上面就是截取的一部分效果图,下面开始进入我们的主题。

一、OpenCV的安装及图片读取

在Python中我们只需要用pip安装即可,我们在控制台执行下列语句:

pip install opencv-python

安装完成就可以开始使用。我们先读取一个图片:

import cv2

im = cv2.imread('jljt')# 读取图片

cv2.imshow('im', im)# 显示图片

cv2.waitKey(0)# 等待键盘输入

cv2.destroyAllWindows()# 销毁内存

首先我们使用cv2.imread方法读取图片,该方法返回一个ndarray对象。然后调用imshow方法显示图像,调用后会出现一个窗口,因为这个窗口只会出现一瞬间,所以我们调用waitKey等待输入,传入0表示无限等待。因为opencv是使用c++编写的,所以我们需要销毁内存。

二、OpenCV中的一些基础操作

我们将视频字符化的思路就是先将视频转换为一帧一帧的图像,然后对图像进行字符化处理,最后展示出来就是字符视频的效果了。在我们生成字符画之前,我们还要看一些OpenCV的操作。

(1)灰度转换

灰度处理是一个非常常用的操作,我们原始的图片是有BGR三个图层(在OpenCV中,图像是以BGR形式读取)。我们进行灰度处理直观上看就是将图片变成黑白,而本质上是将图片的三个图层通过计算,变成一个图层。而这种计算是不需要我们做的,我们只需要调用OpenCV中的函数即可:

import cv2

# 读取图片

im = cv2.imread('jljt.jpg')

# 灰度转换

grey = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)

效果图和原图对比如下:

7d801816a27703a343f9bc2458c419f3.png

左边为原图,右边为灰度转换后的图像。

(3)改变图片大小

因为字符化后图像会比较大,所以我们需要先缩小图片,我们调用cv2.resize即可改变图像大小:

import cv2

# 读取图像

im = cv2.imread('jljt.png')

# 改变图像大小

re = cv2.resize(im, (100, 40))

cv2.imshow('11', re)

cv2.waitKey(0)

cv2.destroyAllWindows()

(2)逐帧读取视频

我们可以通过VideoCapture读取视频,然后调用其中的方法读取每一帧。

import cv2

# 读取视频

video = cv2.VideoCapture('jljt.mp4')

# 读取帧,该方法返回两个参数,第一个为是否还有下一帧,第二个为帧的ndarray对象

ret, frame = video.read()

while ret:

# 循环读取帧

ret, frame = video.read()

有了上面的操作,我们就可以开始我们下一步的工作了。

三、图片字符化

对于只有一个通道的图片,我们可以把它当成一个矩形,这个矩形最小单位就是一个像素。而字符化的过程就是用字符替代像素点的过程。所以我们要遍历图像的每个像素点,但是我们应该用什么字符取代呢?

我们颜色有一个参照表,而opencv将这个参数表切割成256份,代表不同的程度,我们也可以做一个参照表,不过表中的内容不是颜色,而是字符。

94177bd05c85a01a629fe444acf4e0ea.png

上图为颜色表,我们可以使颜色表和字符表建立映射关系。假如字符表如下:

mqpka89045321@#$%^&*()_=||||}

我们可以得到下列公式:

db0f7b48c0b11cc4fbec4abba643d49c.png

经过变换可以求得相应颜色对应字符表中的字符:

93b02f3a46facf3505cfd5ff19b3be17.png

这个公式不理解也没关系,只需要会用即可。下面就是我们完整的代码了:

import cv2

str = 'mqpka89045321@#$%^&*()_=||||}' # 字符表

im = cv2.imread('jljt.jpg')# 读取图像

grey = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)# 灰度转换

grey = cv2.resize(grey, (50, 18))# 缩小图像

str_img = ''# 用于装字符画

for i in grey:# 遍历每个像素

for j in i:

index = int(j / 256 * len(str))# 获取字符坐标

str_img += str[index]# 将字符添加到字符画中

str_img += '\n'

print(str_img)

生成如下字符画:

dc0ea68ea639a255a6a765a05782ad08.png

因为尺寸比较小的关系,看出来的效果不是很好,我们调节好大小就好了。

四、视频转字符

我们知道图片转字符,自然视频转字符就不是什么问题了,我们只需要在逐帧读取中执行图片字符化操作即可。

import os

import cv2

str = 'mqpka89045321@#$%^&*()_=||||}'# 字符表

video = cv2.VideoCapture('jljt.mp4') # 读取视频

ret, frame = video.read()# 读取帧

while ret:# 逐帧读取

str_img = ''# 字符画

grey = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)# 灰度转换

grey = cv2.resize(grey, (100, 40))# 该表大小

for i in grey:# 遍历每个像素点

for j in i:

index = int(j / 256 * len(str))# 获取字符坐标

str_img += str[index]# 将字符添加到字符画中

str_img += '\n'

os.system('cls')# 清除上一帧输出的内容

print(str_img)# 输出字符画

ret, frame = video.read()# 读取下一帧

cv2.waitKey(5)

这样我们就会每个5毫秒执行一帧画面,在我们使用pycharm执行时,会发现并没有执行清屏操作,所以我们需要到命令行运行。最终效果就是我们的字符视频了:

82150a3e3a19f35b8ff6453086de203a.gif

在选取字符表时我们需要注意主体的颜色,如果主体颜色较浅,则字符表的尾部应该为一些复杂字符,如:$%#@&。字符表头部为一些简单字符,如:-|/等。如果主体颜色较深,而背景颜色较浅,则反之。当然这没有唯一的标准,大家可以慢慢调节。

总结

到此这篇关于20行Python代码实现视频字符化的文章就介绍到这了,更多相关python 视频字符化内容请搜索python博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持python博客!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值