来源 | ZackSock(ID:ZackSock)

我们经常在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)

效果图和原图对比如下:

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

(2)改变图片大小

因为字符化后图像会比较大,所以我们需要先缩小图片,我们调用cv2.resize即可改变图像大小:

import cv2
# 读取图像
im = cv2.imread('jljt.png')
# 改变图像大小
re = cv2.resize(im, (100, 40))
cv2.imshow('11', re)
cv2.waitKey(0)
cv2.destroyAllWindows()

(3)逐帧读取视频

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

推荐阅读

  • CycleGan人脸转为漫画脸,牛掰的知识又增加了 | 附代码

  • 一次对语音技术的彻底批判

  • 360金融首席科学家张家兴:别指望AI Lab做成中台

  • 为什么说 C++ 太复杂?有必要这么复杂吗?| 原力计划

  • 关于Spring AOP,除了动态代理、CGLIB,你还知道什么?

  • 产业区块链:新基建中的底层技术基座,各行业资深人士应积极参与建设

  • 你点的每个“在看”,我都认真当成了AI

20行Python代码实现视频字符化相关推荐

  1. python 制作字符视频_20行Python代码实现视频字符化功能

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

  2. opencv画框返回坐标 python_20行Python代码实现视频字符化

    来源 | ZackSock(ID:ZackSock) 我们经常在B站上看到一些字符鬼畜视频,主要就是将一个视频转换成字符的样子展现出来. 看起来是非常高端,但是实际实现起来确实非常简单,我们只需要接触 ...

  3. 视频灰度处理python_20行Python代码实现视频字符化

    来源 |ZackSock(ID:ZackSock) 我们经常在B站上看到一些字符鬼畜视频,主要就是将一个视频转换成字符的样子展现出来. 看起来是非常高端,但是实际实现起来确实非常简单,我们只需要接触o ...

  4. python 字符视频_Python20行代码实现视频字符化

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

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

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

  6. python视频压缩算法_Python入门到精通视频,阿里巴巴大力推荐,20行Python代码,无损压缩千百张图片!...

    阿里巴巴推荐,Python基础入门,Python小白书籍,Python学习路线,Python进阶,Python高级,Python爬虫等等一系列关于Python的文档和视频(包括hadoop,fink, ...

  7. python红色的颜色表达式_50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)...

    目前计算机视觉(CV)与自然语言处理(NLP)及语音识别并列为人工智能三大热点方向,而计算机视觉中的对象检测(objectdetection)应用非常广泛,比如自动驾驶.视频监控.工业质检.医疗诊断等 ...

  8. 20行 Python 代码爬取王者荣耀全英雄皮肤 | 原力计划

    作者 | wangweijun 责编 | Elle 出品 | CSDN 博客 引言 王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了.我们今天的重点是爬取王 ...

  9. 项目分享丨20行Python代码,无损压缩千百张图片!

    前言 每个设计师.摄影师或有图片处理需求小编,都会面临批量高清大图的困扰. 因为高清大图放到网站上会严重拖慢加载速度,或是有的地方明确限制了图片大小,因此,为了完成工作,他们总是需要先把图片压缩,再上 ...

最新文章

  1. Java设计模式之五大创建型模式(附实例和详解)
  2. BCH开发Cashscript语言,可构建自主决策交易特定方案
  3. 共识协议(6)PBFT详细步骤
  4. JavaScript点击事件-一个按钮触发另一个按钮
  5. Java 8:对集合中的值进行排序
  6. 使用Minions解释JavaScript回调
  7. 疯狂java的第四章答案_疯狂java讲义第四章第一题
  8. excel怎么设置一个按钮就一点就生成一个表_条码生成软件如何批量生成DPD条码...
  9. Python3 局部变量与全局变量作用域
  10. MTK 驱动 (70)---MTK Projiectconfig.mk文件详细解释
  11. 1899元起!iQOO Z5造梦空间配色明日正式开售
  12. spring在java工程中的运用
  13. asp.net Ajax表单提交 二种方式数据处理 asp.net
  14. ServletContextListener 启动SPRING加载数据到缓存的应用
  15. 如何在线伪造邮箱发件人,用任意邮箱发送邮件
  16. 计算机考试表格函数应用题,2017年职称计算机考试Excel练习题2
  17. 凸优化 - 3 - Jensen不等式、共轭函数、Fenchel不等式
  18. Python描述 LeetCode 8. 字符串转换整数 (atoi)
  19. 13年草根程序员转型之路
  20. 精细化运营:RFM模型在手游付费用户分群中的优化与应用

热门文章

  1. Lambda中的常用sql方法
  2. PostgreSQL SQL 语言:并行查询
  3. cocos2dx 场景的切换
  4. 只能在堆或只能在栈上分配内存的类
  5. 代码示例_网络编程_select
  6. [C#][EF] 添加表添加不进来
  7. 视觉稿与H5页面之间的终端适配
  8. [您有新的未分配科技点]可,可,可持久化!?------0-1Trie和可持久化Trie普及版讲解...
  9. LR常见的报错处理方法
  10. html css 布局知识概况