python 制作字符视频_20行Python代码实现视频字符化功能
我们经常在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执行时,会发现并没有执行清屏操作,所以我们需要到命令行运行。最终效果就是我们的字符视频了:
在选取字符表时我们需要注意主体的颜色,如果主体颜色较浅,则字符表的尾部应该为一些复杂字符,如:$%#@&。字符表头部为一些简单字符,如:-|/等。如果主体颜色较深,而背景颜色较浅,则反之。当然这没有唯一的标准,大家可以慢慢调节。
总结
到此这篇关于20行Python代码实现视频字符化的文章就介绍到这了,更多相关python 视频字符化内容请搜索python博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持python博客!
python 制作字符视频_20行Python代码实现视频字符化功能相关推荐
- python pdf编辑开发_20行Python代码实现一款永久免费PDF编辑工具的实现
PDF(Portable Document Format),中文名称便携文档格式是我们经常会接触到的一种文件格式,文献.文档...很多都是PDF格式.它以格式稳定的优势,使得我们在打印.分享.传输过程 ...
- python爬取图解_20行PYTHON代码爬取微博高清大图,小白练手绝佳案例
0. 前戏说明 环境说明 python3版本 所需库:Beautifulsoup .re .requests 知识点:正则表达式.基本网页请求与解析.文件写入 适用人群:小白 最终目标:20行代码爬取 ...
- python制作课程表提醒_10行Python代码制作群聊提醒小助手,再也不怕漏掉消息了...
前言 大家还记得教会父母玩微信是什么时候吗?父母学会后,我们的生活就发生了「质」的变化,父母也许会吐槽你的微信头像不好,要你换一个头像. 最近 pk哥 又被母后大人吐槽了,原因是亲戚微信群里某个亲戚生 ...
- 使用python制作ArcGIS插件(2)代码编写
使用python制作ArcGIS插件(2)代码编写 by 李远祥 上一章节已经介绍了如何去搭建AddIn的界面,接下来要实现具体的功能,则到了具体的编程环节.由于使用的是python语言进行编程,则开 ...
- python读取文件第n行-Python读取文件后n行的代码示例
这篇文章主要介绍了Python实现读取文件最后n行的方法,涉及Python针对文件的读取.遍历与运算相关操作技巧,需要的朋友可以参考下# -*- coding:utf8-*- import os im ...
- python自动化--如何用10行Python代码调一个闹钟 #电脑调闹钟
python自动化--如何用10行Python代码写一个闹钟 前言: 文末彩蛋--轻松一刻 更多关于Python的知识请加关注哟~~.若需联系博主请私信或者加博主联系方式: QQ:1542 ...
- python制作电脑软件_利用PYTHON制作桌面版爬虫软件(二)
今天继续新的专题.主要讲解[利用PYTHON制作桌面版爬虫软件]下的如何实现界面功能(一).该讲主要包括以下三个内容:掌握如何编写主函数,运行界面. 了解pywin32模块. 如何用python识别Q ...
- 专属微信二维码python制作_教你使用Python制作酷炫二维码
这篇文章讲的是如何利用python制作狂拽酷炫吊炸天的二维码,非常有趣哦! 可能你见过的二维码大多长这样: 稍微好看点的长这样: 普普通通,平平凡凡,没什么特色... 但,如果二维码长这样呢! 或者这 ...
- Java黑皮书课后题第6章:6.12(显示字符)使用下面的方法头,编写一个打印字符的方法。编写一个测试程序、打印从‘1‘到‘Z‘的字符,每行打印10个,字符之间使用一个空格字符隔开
6.12(显示字符)使用下面的方法头,编写一个打印字符的方法.编写一个测试程序.打印从'1'到'Z'的字符,每行打印10个,字符之间使用一个空格字符隔开 题目 题目描述 破题 补充:从生成随机字符窥探 ...
最新文章
- 采访Jesús Fernandes(QA主管)
- iOS 总结遇到的各种坑儿
- 簡單安裝軟件 GNU Linux
- r语言各形状编号_R语言入门第八讲:编码分类变量(factor)
- python中反斜杠_Python中的正斜杠/与反斜杠\
- 《底层逻辑》--思维导图
- 解决git pull 命令失效,不能从远程服务器上拉取代码问题
- 离线安装wxpython_windows离线状态下源码安装Robotframework 环境及其依赖包
- 基于Java的智能问答系统
- 韩国李世石跟韩国AI大战,2负一胜
- UnityWebRequest下载文件
- 销售合同管理系统,发票统计。 Excel表格,自带公式,简单操作
- 坚果pro官方固件_坚果Pro线刷包_坚果Pro刷机包_坚果Pro固件包_坚果Pro救砖包 - 线刷宝ROM中心...
- 页面加载时,下方内容在上方图片位置闪现
- 《白雪歌送武判官归京》古诗鉴赏
- nicstat-网络流量统计利器
- 旅行青蛙服务器维护时间,旅行青蛙多久出门一次?青蛙旅行出门时间一览
- 自考本科英语(二)学习笔记和考试经验
- [Windows][VC]开机自动启动程序的几种方法
- 中国设计在重庆丨5G+VR直播直击秋冬风尚大秀