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,看到抠鼻屎的就是我没错了。

python 字符视频_Python20行代码实现视频字符化相关推荐

  1. python判断成语_Python20行代码用正则表达式查询成语含特定汉字者

    我昨日(2020年9月20日)设计了一份Python代码,用正则表达式,查询成语之包含特定汉字者.代码如下: import re def data_read(filepath): global lin ...

  2. Python20行代码实现视频字符化

    Python20行代码实现视频字符化 我们经常在B站上看到一些字符鬼畜视频,主要就是将一个视频转换成字符的样子展现出来.看起来是非常高端,但是实际实现起来确实非常简单,我们只需要接触opencv模块, ...

  3. python小游戏-16行代码实现3D撞球小游戏!-源码下载

    python小游戏-16行代码实现3D撞球小游戏!-源码下载 所属网站分类: 资源下载 > python小游戏 作者:搞笑 链接: http://www.pythonheidong.com/bl ...

  4. Python爬虫利用18行代码爬取虎牙上百张小姐姐图片

    Python爬虫利用18行代码爬取虎牙上百张小姐姐图片 下面开始上代码 需要用到的库 import request #页面请求 import time #用于时间延迟 import re #正则表达式 ...

  5. Matlab:连续按键、移动鼠标、鼠标点击、鼠标连点、输入字符,10行代码即可。

    Matlab也可以实现按键J灵的一些基本功能,比如:连续按键.移动鼠标.鼠标点击.鼠标连点和输入字符!其中, "连续按键":指间隔一定的时间(如:0.1s)按一下某个按键(如:键盘 ...

  6. 阿里云视频云低代码音视频工厂正式上线,以vPaaS全新定义企业级音视频应用开发

    1月5日,阿里云视频云"低代码音视频工厂vPaaS"正式上线,极大程度降低音视频开发门槛,打破传统音视频技术壁垒,全新定义企业级的音视频应用开发. 低代码音视频工厂基于云原生.音视 ...

  7. Java黑皮书课后题第5章:*5.15(显示ASCII码字符表)编写一个程序,打印ASCII字符表从‘!‘到‘~‘的字符。每行打印10个字符。ASCII码表如附录B所示。数字之间用一个空格字符隔开

    *5.15(显示ASCII码字符表)编写一个程序,打印ASCII字符表从'!'到'~'的字符.每行打印10个字符.ASCII码表如附录B所示.数字之间用一个空格字符隔开 题目 题目概述 '!'到'~' ...

  8. python爬取小视频-40行代码教你利用Python网络爬虫批量抓取小视频

    /1 前言/ 还在为在线看小视频缓存慢发愁吗?还在为想重新回味优秀作品但找不到资源而忧虑吗?莫要慌,让python来帮你解决,40行代码教你爬遍小视频网站,先批量下载后仔细观看,岂不美哉! /2 整理 ...

  9. 用 Python 做个小姐姐代码蹦迪视频

    前言 最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿遍又亿遍,久久不能离开! 看着仙紫小姐姐的蹦迪视频,除了一键三连还能做什么?突发奇想,能不能把小仙女的蹦迪视频转成代码舞呢? 说干就干,今天 ...

最新文章

  1. ◦将一个java文件变成Jar包的过程
  2. 【渝粤教育】国家开放大学2018年秋季 0690-21T化工原理及实验 参考试题
  3. flask上传excel文件,无须存储,直接读取内容
  4. rabbitmq进阶一
  5. python 全中文匹配字符_Python教程:进程和线程amp;正则表达式
  6. WebSphere 集群环境下配置 Quartz集群
  7. 出生就遇浏览器大战,亲爹还不爱,命运坎坷的JavaScript终于苦尽甘来
  8. Java微信小微商户进件,已经解决接口暂无权限,稍后再试的问题
  9. 大咖联袂发布!《慧技术·惠金融——2022金融科技趋势研究报告》开放下载
  10. Pytorch下的卷积和池化
  11. 利用软路由,轻松实现宽带叠加,已达到千兆网速的效果
  12. 在vue中使用three.js创建一个简单的立体图形
  13. openwrt - iperf3 内网测速
  14. 计算机怎样打开鼠标点的键盘,如何打开计算机虚拟键盘?五种打开计算机虚拟键盘的方法简介...
  15. 我的世界Bukkit插件开发(4)——命令
  16. win7 关机速度比较快
  17. 服务器ping返回信息,如何ping服务器线路?ping命令的用法
  18. ctr 平滑_ctr平滑
  19. 数据分析-业务理解篇指标设计篇
  20. PHP利用CURL_MULTI实现多线程爆破

热门文章

  1. PPNet模型和tf.stop_gradient的用法
  2. WPS不能输入中文的解决方法
  3. 家是文艺腔,更是烟火气
  4. python day6
  5. 知彼知己 - 细数各大互联网网站系统的实现语言
  6. 2007大盘点之十大史上最牛(不是一般的牛X!)
  7. Flash媒体服务器的强化指南
  8. Emoji 表情转义止于前端
  9. uniapp微信一键登录微信授权
  10. 让自定义的类型可以和任意的类型之间转换