Python20行代码实现视频字符化
Python20行代码实现视频字符化
我们经常在B站上看到一些字符鬼畜视频,主要就是将一个视频转换成字符的样子展现出来。看起来是非常高端,但是实际实现起来确实非常简单,我们只需要接触opencv模块,就能很快的实现视频字符化。但是在此之前,我们先看看我们实现的效果是怎样的:
上面就是截取的一部分效果图,下面开始进入我们的主题。
一、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)
效果图和原图对比如下:
左边为原图,右边为灰度转换后的图像。
(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份,代表不同的程度,我们也可以做一个参照表,不过表中的内容不是颜色,而是字符。
上图为颜色表,我们可以使颜色表和字符表建立映射关系。假如字符表如下:
mqpka89045321@#$%^&*()_=||||}
我们可以得到下列公式:
经过变换可以求得相应颜色对应字符表中的字符:
这个公式不理解也没关系,只需要会用即可。下面就是我们完整的代码了:
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)
生成如下字符画:
因为尺寸比较小的关系,看出来的效果不是很好,我们调节好大小就好了。
四、视频转字符
我们知道图片转字符,自然视频转字符就不是什么问题了,我们只需要在逐帧读取中执行图片字符化操作即可。
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执行时,会发现并没有执行清屏操作,所以我们需要到命令行运行。最终效果就是我们的字符视频了:
在选取字符表时我们需要注意主体的颜色,如果主体颜色较浅,则字符表的尾部应该为一些复杂字符,如:$%#@&
。字符表头部为一些简单字符,如:-|/
等。如果主体颜色较深,而背景颜色较浅,则反之。当然这没有唯一的标准,大家可以慢慢调节。感兴趣的读者,可以关注我的个人公众号:ZackSock,看到抠鼻屎的就是我没错了。
精 彩 文 章
抄作业了!6 大 Flask 开源实战项目推荐
面试官问我:如何设计 QQ、微信等第三方账号登陆 ?
VS Code 连接远程服务器运行 Jupyter Notebook
END
最后说个题外话,相信大家都知道视频号了,随着灰度范围扩大,越来越多的小伙伴都开通了视频号。小詹也开通了一个视频号,会分享互联网那些事、读书心得与副业经验,欢迎扫码关注,和小詹一起向上生长!「没有开通发布权限的尽量多互动,提升活跃度可以更快开通哦」
Python20行代码实现视频字符化相关推荐
- python 字符视频_Python20行代码实现视频字符化
Python20行代码实现视频字符化 我们经常在B站上看到一些字符鬼畜视频,主要就是将一个视频转换成字符的样子展现出来.看起来是非常高端,但是实际实现起来确实非常简单,我们只需要接触opencv模块, ...
- python 制作字符视频_20行Python代码实现视频字符化功能
我们经常在B站上看到一些字符鬼畜视频,主要就是将一个视频转换成字符的样子展现出来.看起来是非常高端,但是实际实现起来确是非常简单,我们只需要接触opencv模块,就能很快的实现视频字符化.但是在此之前 ...
- 20行Python代码实现视频字符化
来源 | ZackSock(ID:ZackSock) 我们经常在B站上看到一些字符鬼畜视频,主要就是将一个视频转换成字符的样子展现出来. 看起来是非常高端,但是实际实现起来确实非常简单,我们只需要接触 ...
- opencv画框返回坐标 python_20行Python代码实现视频字符化
来源 | ZackSock(ID:ZackSock) 我们经常在B站上看到一些字符鬼畜视频,主要就是将一个视频转换成字符的样子展现出来. 看起来是非常高端,但是实际实现起来确实非常简单,我们只需要接触 ...
- 视频灰度处理python_20行Python代码实现视频字符化
来源 |ZackSock(ID:ZackSock) 我们经常在B站上看到一些字符鬼畜视频,主要就是将一个视频转换成字符的样子展现出来. 看起来是非常高端,但是实际实现起来确实非常简单,我们只需要接触o ...
- 20行Python代码教你让视频字符化
我们经常在B站上看到一些字符鬼畜视频,主要就是将一个视频转换成字符的样子展现出来.看起来是非常高端,但是实际实现起来确实非常简单,我们只需要接触opencv模块,就能很快的实现视频字符化. OpenC ...
- python编辑视频字符化_Python 视频转字符画 - 进阶
这篇文章是 视频转字符动画-Python-60行代码 的后续,如果感兴趣,请先看看它. 0. 话说在前头 最新版使用了画布方式实现,和本文相比改动非常大,如果对旧版本的实现没啥兴趣,可以直接移步 vi ...
- 200行代码实现视频人物实时去除
今天在GitHub上发现了一个好玩的代码,短短几百行代码就实现了从复杂的背景视频中去除人物,不得不说这位大佬比较厉害. 这个项目只需要在网络浏览器中使用JavaScript,用200多行TensorF ...
- Python 利用4行代码实现图片灰度化
背景 不论是在进行深度学习时的图片处理,还是在商业用途出版书刊,基本都会用到对图片进行灰度转换,也就是灰度化,本文章利用简单的4行代码来快速实现图片灰度化,仅供参考 效果 实现代码 from PIL ...
最新文章
- 让程序主窗口不显示在任务栏中
- Android Parcelable 源码解析
- java transient_【转】Java中的关键字 transient
- MySQL的基本语法
- mysql 第二天数据_MySQL入门第二天------数据库操作
- Docker精华问答 | 如何让一个容器连接两个网络?
- 一个测试工程师面试官的真实分享!个人超赞同!
- kelvin模型蠕变方程_第二章:黏弹性与波传播——2.4 力学模型和波传播
- LeetCode-25:K 个一组翻转链表
- 【英语学习】【Level 08】U04 What I love L3 A good buy
- 李国庆夺章后“发配”俞渝,当当网上线“从摔杯到抢章”专题,书目亮了
- listview item里面的控件点击事件
- 试一下live writer 插入代码是否会高亮
- 函数栈帧的创建和销毁图解
- 译稿:软件工程师不可不知的10个概念
- Oracle 在SQL语句中如何获取系统当前时间并进行操作
- Nginx主配置文件的优化-nginx主配置文件的优化
- ios swift判断两个对象是否相等 == isEqual remove add
- CocosCreator黄金矿工资源工程文件
- 计算机逻辑部件按其结构可分为,《数字逻辑电路》期末大作业实验报告
热门文章
- 浅谈Nginx服务器的内部核心架构设计
- 数据库中查询记录时是否每次只能使用一个索引?
- Redis内部数据结构详解之简单动态字符串(sds)
- 解压zip文件出现-bash:unzip:commond not found
- CSS的display:none与visible:hidden区别
- unsw计算机科学的挂科率,澳洲新南威尔士大学考试挂科率达41%
- ironpython2.7.9_Microsoft IronPython_.NET和Python实现平台下载 v2.7.9.1000最新官方版
- python连接es_Elasticsearch --- 3. ik中文分词器, python操作es
- java extensions JAR files
- 【若依(ruoyi)】jQuery.validator