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中的类与实例
Apr 27 Python
Python实现数通设备端口使用情况监控实例
Jul 15 Python
Python2.7+pytesser实现简单验证码的识别方法
Dec 29 Python
Python模拟脉冲星伪信号频率实例代码
Jan 03 Python
python+opencv轮廓检测代码解析
Jan 05 Python
python 中的list和array的不同之处及转换问题
Mar 13 Python
python3 读写文件换行符的方法
Apr 09 Python
python实现贪吃蛇游戏
Mar 21 Python
解决python-docx打包之后找不到default.docx的问题
Feb 13 Python
Python编程快速上手——正则表达式查找功能案例分析
Feb 28 Python
Python unittest 自动识别并执行测试用例方式
Mar 09 Python
Windows下Sqlmap环境安装教程详解
Aug 04 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
WINDOWS 2000下使用ISAPI方式安装PHP
2006/09/05 PHP
PHP设计模式之解释器模式的深入解析
2013/06/13 PHP
教你如何开启shopnc b2b2c 伪静态
2014/10/21 PHP
基于PHP给大家讲解防刷票的一些技巧
2015/11/18 PHP
php简单实现短网址(短链)还原的方法(测试可用)
2016/05/09 PHP
Avengerls vs KG BO3 第三场2.18
2021/03/10 DOTA
javascript 字符 Escape,encodeURI,encodeURIComponent
2009/07/09 Javascript
input标签内容改变的触发事件介绍
2014/06/18 Javascript
js随机生成字母数字组合的字符串 随机动画数字
2015/09/02 Javascript
使用AJAX实现Web页面进度条的实例分享
2016/05/06 Javascript
url传递的参数值中包含&时,url自动截断问题的解决方法
2016/08/02 Javascript
JS中跨页面调用变量和函数的方法(例如a.js 和 b.js中互相调用)
2016/11/01 Javascript
详谈js中数组(array)和对象(object)的区别
2017/02/27 Javascript
浅谈react-native热更新react-native-pushy集成遇到的问题
2017/09/30 Javascript
JavaScript实现的DOM绘制柱状图效果示例
2018/08/08 Javascript
[02:44]DOTA2英雄基础教程 魅惑魔女
2014/01/07 DOTA
python 中文字符串的处理实现代码
2009/10/25 Python
Python中字符串的常见操作技巧总结
2016/07/28 Python
如何利用python进行时间序列分析
2020/08/04 Python
详解CSS3原生支持div铺满浏览器的方法
2018/08/30 HTML / CSS
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
HTML5拖放API实现自动生成相框功能
2020/04/07 HTML / CSS
Ever New美国:澳大利亚领先的女装时尚品牌
2019/11/28 全球购物
如何选择使用结构还是类
2014/05/30 面试题
静态变量和实例变量的区别
2015/07/07 面试题
行政专员工作职责
2013/12/22 职场文书
学前教育专业求职信
2014/09/02 职场文书
2014党员学习《反腐倡廉警示教育读本》思想汇报
2014/09/13 职场文书
先进集体申报材料
2014/12/25 职场文书
幼儿园亲子活动通知
2015/04/24 职场文书
《穷人》教学反思
2016/02/19 职场文书
高三化学教学反思
2016/02/22 职场文书
详解MySQL 用户权限管理
2021/04/20 MySQL
SQL中的三种去重方法小结
2021/11/01 SQL Server
pytorch中的torch.nn.Conv2d()函数图文详解
2022/02/28 Python
Python用tkinter实现自定义记事本的方法详解
2022/03/31 Python