来源 |ZackSock(ID:ZackSock)

我们经常在B站上看到一些字符鬼畜视频,主要就是将一个视频转换成字符的样子展现出来。

看起来是非常高端,但是实际实现起来确实非常简单,我们只需要接触opencv模块,就能很快的实现视频字符化。但是在此之前,我们先看看我们实现的效果是怎样的:

在这里插入图片描述

上面就是截取的一部分效果图,下面开始进入我们的主题。

OpenCV的安装及图片读取

在Python中我们只需要用pip安装即可,我们在控制台执行下列语句:

pipinstallopencv-python

安装完成就可以开始使用。我们先读取一个图片:

importcv2 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中的函数即可:

importcv2 #读取图片 im=cv2.imread('jljt.jpg') #灰度转换 grey=cv2.cvtColor(frame,cv2.COLOR_RGB2GRAY)

效果图和原图对比如下:

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

(2)改变图片大小

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

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

我们可以通过VideoCapture读取视频,然后调用其中的方法读取每一帧。

importcv2 #读取视频 video=cv2.VideoCapture('jljt.mp4') #读取帧,该方法返回两个参数,第一个为是否还有下一帧,第二个为帧的ndarray对象 ret,frame=video.read() whileret: #循环读取帧 ret,frame=video.read()

有了上面的操作,我们就可以开始我们下一步的工作了。

图片字符化

对于只有一个通道的图片,我们可以把它当成一个矩形,这个矩形最小单位就是一个像素。而字符化的过程就是用字符替代像素点的过程。所以我们要遍历图像的每个像素点,但是我们应该用什么字符取代呢?

我们颜色有一个参照表,而opencv将这个参数表切割成256份,代表不同的程度,我们也可以做一个参照表,不过表中的内容不是颜色,而是字符。

颜色表

上图为颜色表,我们可以使颜色表和字符表建立映射关系。假如字符表如下:

mqpka89045321@#$%^&*()_=||||}

我们可以得到下列公式:

颜色和字符之间的等式

经过变换可以求得相应颜色对应字符表中的字符:

获取字符在字符表中的位置

这个公式不理解也没关系,只需要会用即可。下面就是我们完整的代码了:

importcv2 str='mqpka89045321@#$%^&*()_=||||}'#字符表 im=cv2.imread('jljt.jpg')#读取图像 grey=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)#灰度转换 grey=cv2.resize(grey,(50,18))#缩小图像 str_img=''#用于装字符画 foriingrey:#遍历每个像素 forjini: index=int(j/256*len(str))#获取字符坐标 str_img+=str[index]#将字符添加到字符画中 str_img+='\n' print(str_img)

生成如下字符画:

字符画

因为尺寸比较小的关系,看出来的效果不是很好,我们调节好大小就好了。

视频转字符

我们知道图片转字符,自然视频转字符就不是什么问题了,我们只需要在逐帧读取中执行图片字符化操作即可。

importos importcv2 str='mqpka89045321@#$%^&*()_=||||}'#字符表 video=cv2.VideoCapture('jljt.mp4')#读取视频 ret,frame=video.read()#读取帧 whileret:#逐帧读取 str_img=''#字符画 grey=cv2.cvtColor(frame,cv2.COLOR_RGB2GRAY)#灰度转换 grey=cv2.resize(grey,(100,40))#该表大小 foriingrey:#遍历每个像素点 forjini: 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_20行Python代码实现视频字符化相关推荐

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

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

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

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

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

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

  4. 20行Python代码实现视频字符化

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

  5. 50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)

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

  6. n行Python代码系列专栏文章目录

    ☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░ 一.专栏简介 本专栏介绍使用少量Python代码(n行,n小于等于10)实现特定的功能或能 ...

  7. n行Python代码系列:两行代码实现彩色视频转换为灰度视频

    ☞ ░ 老猿Python博文目录 ░ 一.引言 最近看到好几篇类似"n行Python代码-"的博文,看起来还挺不错,简洁.实用,传播了知识.带来了阅读量,撩动了老猿的心,决定跟风一 ...

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

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

  9. n行Python代码系列:五行代码实现两个视频画中画播放

    ☞ ░ 老猿Python博文目录:https://blog.csdn.net/LaoYuanPython ░ 一.引言 最近看到好几篇类似"n行Python代码-"的博文,看起来还 ...

最新文章

  1. 大数据及Linux安装
  2. 2017 五月 UFED Series Releases 系列 6.2更新发布
  3. D0rado与javascript
  4. 微服务网关Gateway中StripPrefix讲解
  5. 软考网络工程师学习笔记1-计算机网络概念
  6. 全球第一!苹果市值冲破3万亿美元 创历史记录
  7. 网络介绍 > 网络连接 > 混合云网络
  8. java 管理系统 注释_员工管理系统--带注释--oracle系统--java项目
  9. 三菱PLC进行连续数据采集、时序和故障追踪的方法
  10. matplotlib读取png文件错误ValueError: invalid PNG header
  11. 熔断器 java_SpringCloud之熔断器Hystrix的实现
  12. 如何解决竞价推广中的恶意点击?
  13. php mongodb lookup,mongodb-在$lookup管道中使用$match$进行聚合
  14. Kotlin中对象检查判断
  15. PgMP项目集管理专家认证培---艾威PgMP培训机构
  16. 阿里龙蜥centos8.4 postgis 源码安装
  17. 【自动化】国内自动化与信息化产业仍有十年以上的产业繁荣;非标自动化业务你离BOSS只差一个认知
  18. 无法为数据库中的对象分配空间,因为'PRIMARY'文件组已满
  19. 京东登月平台基础架构技术解析
  20. Implement a customized pin code input control

热门文章

  1. PSP开发指南第五课
  2. 手机实况足球2018 服务器维护进行中,梦幻足球联盟2018进不去 | 手游网游页游攻略大全...
  3. ubuntu系统无法连接网络
  4. JavaScript 如何工作的: 事件循环和异步编程的崛起 + 5 个关于如何使用 async/await 编写更好的技巧...
  5. 台服lol手游服务器正在维护,lol手游台服正在取得版本资料怎么办?正在取得版本解决方法[多图]...
  6. 基于python的智能家居系统_基于Python Django的可扩展智能家居系统
  7. 预产期计算器在线计算生男生女计算机,预产期计算器生男生女方法(附预测表)...
  8. Json 错误com.fasterxml.jackson.databind.exc.MismatchedInputException:Cannot construct instance of
  9. 数据分析实战——日化用品在门店的销售分析
  10. 去除面部黑色素小妙招_怎么淡斑祛除脸部黑色素 5个小妙招有效淡斑美白