20行Python代码实现视频字符化功能


Posted in Python onApril 13, 2020

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

20行Python代码实现视频字符化功能

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

一、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)

效果图和原图对比如下:

20行Python代码实现视频字符化功能

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

(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份,代表不同的程度,我们也可以做一个参照表,不过表中的内容不是颜色,而是字符。

20行Python代码实现视频字符化功能

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

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

我们可以得到下列公式:

20行Python代码实现视频字符化功能

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

20行Python代码实现视频字符化功能

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

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)

生成如下字符画:

20行Python代码实现视频字符化功能

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

四、视频转字符

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

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执行时,会发现并没有执行清屏操作,所以我们需要到命令行运行。最终效果就是我们的字符视频了:

20行Python代码实现视频字符化功能

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

总结

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

Python 相关文章推荐
python 连接sqlite及简单操作
Jun 30 Python
python 用正则表达式筛选文本信息的实例
Jun 05 Python
浅谈Python脚本开头及导包注释自动添加方法
Oct 27 Python
Python Tkinter 简单登录界面的实现
Jun 14 Python
django Admin文档生成器使用详解
Jul 22 Python
python爬虫增加访问量的方法
Aug 22 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
Aug 22 Python
Python序列对象与String类型内置方法详解
Oct 22 Python
DjangoWeb使用Datatable进行后端分页的实现
May 18 Python
简述 Python 的类和对象
Aug 21 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
Nov 27 Python
python openpyxl模块的使用详解
Feb 25 Python
解决jupyter notebook 前面书写后面内容消失的问题
Apr 13 #Python
jupyter notebook实现显示行号
Apr 13 #Python
Python文件时间操作步骤代码详解
Apr 13 #Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
Apr 12 #Python
Python求凸包及多边形面积教程
Apr 12 #Python
python实现人脸签到系统
Apr 13 #Python
python实现IOU计算案例
Apr 12 #Python
You might like
PHP下几种删除目录的方法总结
2007/08/19 PHP
php简单的留言板与回复功能具体实现
2014/02/19 PHP
PHP启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
2014/10/20 PHP
基于PHP常用文件函数和目录函数整理
2017/08/17 PHP
JS与框架页的操作代码
2010/01/17 Javascript
c#程序员对TypeScript的认识过程
2015/06/19 Javascript
jQuery动画显示和隐藏效果实例演示(附demo源码下载)
2015/12/31 Javascript
浅析JavaScript Array和string的转换(推荐)
2016/05/20 Javascript
巧用jQuery选择器提高写表单效率的方法
2016/08/19 Javascript
利用原生js和jQuery实现单选框的勾选和取消操作的方法
2016/09/04 Javascript
利用BootStrap弹出二级对话框的简单实现方法
2016/09/21 Javascript
JavaScript正则表达式实例详解
2016/10/16 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
JavaScript 函数节流详解及方法总结
2017/02/09 Javascript
vuejs2.0运用原生js实现简单的拖拽元素功能示例
2017/02/24 Javascript
vue与TypeScript集成配置最简教程(推荐)
2017/10/17 Javascript
详解Webpack+Babel+React开发环境的搭建的方法步骤
2018/01/09 Javascript
angular ng-model 无法获取值的处理方法
2018/10/02 Javascript
Node.js + express基本用法教程
2019/03/14 Javascript
mpvue性能优化实战技巧(小结)
2019/04/17 Javascript
JavaScript实现身份证验证代码实例
2019/08/26 Javascript
js获取浏览器地址(获取第1个斜杠后的内容)
2019/09/03 Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
2020/01/08 Javascript
[00:44]TI7不朽珍藏III——军团指挥官不朽展示
2017/07/15 DOTA
[07:06]2018DOTA2国际邀请赛寻真——卫冕冠军Team Liquid
2018/08/10 DOTA
python中字符串比较使用is、==和cmp()总结
2018/03/18 Python
python实现对任意大小图片均匀切割的示例
2018/12/05 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
2020/04/07 Python
关于tf.matmul() 和tf.multiply() 的区别说明
2020/06/18 Python
python解压zip包中文乱码解决方法
2020/11/27 Python
Python 生成短8位唯一id实战教程
2021/01/13 Python
写给爸爸的道歉信
2014/01/15 职场文书
优秀党员主要事迹
2014/01/19 职场文书
体育系毕业生求职自荐信
2014/04/16 职场文书
医生辞职信范文
2015/03/02 职场文书
幼儿园大班开学寄语(2015秋季)
2015/05/27 职场文书