Python生成字符视频

一、前言

在之前也写过生成字符视频的文章,但是使用的是命令行窗口输出,效果不是很好,而且存在卡顿的情况。于是我打算直接生成一个mp4的字符视频。大致思路和之前一样:Python20行代码实现视频字符化。

下面来看一个效果图:

二、OpenCV的操作图像

我们先来看一些基本操作。首先我们需要安装OpenCV,执行下面语句:

pip install opencv-python

之后就可以使用了。

2.1、读取和显示

我们直接看代码:

import cv2
# 读取图片
img = cv2.imread("1.jpg")
# 显示图片
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

其中waitKey是等待输入的函数,因为imshow之后显示一瞬间,所以我们需要调用它。而destroyAllWindows是释放窗口。

2.2、灰度转换

灰度转换就是将图片转换成黑白图片(灰色),这样可以方便我们处理像素。代码如下:

import cv2
img = cv2.imread("1.jpg")
# 灰度转换
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

我们还可以直接以灰度形式读入:

import cv2
# 以灰度形式读入
img = cv2.imread("1.jpg", 0)

2.4、获取图片尺寸并修改尺寸

我们直接看代码:

import cv2
img = cv2.imread("1.jpg", 0)
# 获取图片的高宽
h, w = img.shape
# 缩放图片
res = cv2.resize(img, (w//2, h//2))

因为img的shape属性是一个元组,所以我们可以直接自动拆包。

然后调用cv2.resize函数,第一个参数传入图片,第二个参数传入修改后的尺寸。

2.5、绘制文字

绘制文字我们需要调用cv2.putText函数,代码如下:

import cv2
img = cv2.imread('1.jpg')
# 绘制文字
cv2.putText(# 背绘制的图片img, # 要绘制的文字'Hello',# 文字左下角的坐标(100, 500),# 字体cv2.FONT_HERSHEY_SIMPLEX,# 字体大小缩放20, # 文字颜色(0, 0, 0),# 文字粗细10
)

我们只需要注意这些参数就好了。

2.6、读取视频

读取视频的操作一般是通用的,代码如下:

import cv2
# 读取视频
cap = cv2.VideoCapture('1.mp4')
# 获取视频的帧率
fps = cap.get(cv2.CAP_PROP_FPS)
# 循环读取图片的每一帧
while True:# 读取下一帧ret, frame = cap.read()if not ret:breakelse:pass
cap.release()

上面我们获取的视频的帧,在写入视频的时候我们需要用到。

2.7、写入视频

写入视频的操作也是常规代码:

import cv2
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
writer = cv2.VideoWriter('11.mp4', fourcc, fps, (w, h))
# 写入视频
writer.write(frame)
***
write.release()

有了这些知识,我们就可以开始下一步工作了。

三、像素映射成字符

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

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

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

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

我们可以得到下列公式:

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

这个公式不理解也没关系,只需要会用即可。下面就是我们像素转字符的代码:

def pixel2char(pixel):char_list = "@#$%&erytuioplkszxcv=+---.     "index = int(pixel / 256 * len(char_list))return char_list[index]

这个字符表是可以自己定义的。

四、生成字符图片

现在我们只需要将像素逐个转换成字符就好了,代码如下:

def get_char_img(img, scale=4, font_size=5):# 调整图片大小h, w = img.shapere_im = cv2.resize(img, (w//scale, h//scale))# 创建一张图片用来填充字符char_img = np.ones((h//scale*font_size, w//scale*font_size), dtype=np.uint8)*255font = cv2.FONT_HERSHEY_SIMPLEX# 遍历图片像素for y in range(0, re_im.shape[0]):for x in range(0, re_im.shape[1]):char_pixel = pixel2char(re_im[y][x])cv2.putText(char_img, char_pixel, (x*font_size, y*font_size), font, 0.5, (0, 0, 0))return char_img

这里我们使用了一个np.ones函数,它的作用我们理解为生成一个黑色图片。

生成的尺寸我们先除了scale,如何再乘font_size。scale是原图的缩小程度,因为像素有很多,所以我们需要先把图片缩小。而为了让我们的字体显示更清楚,我们需要把生成的字符图片放大。

因此需要注意,虽然我们生成的图片看起来单调,但是当font_size设置为5时,得到的图片已经比较大了。因此当你生成长时间的视频时,会花费比较多的时间,生成的视频也比较大。

我们来测试一下上面的函数:

import cv2
import numpy as npdef pixel2char(pixel):char_list = "@#$%&erytuioplkszxcv=+---.     "index = int(pixel / 256 * len(char_list))return char_list[index]def get_char_img(img, scale=4, font_size=5):# 调整图片大小h, w = img.shapere_im = cv2.resize(img, (w//scale, h//scale))# 创建一张图片用来填充字符char_img = np.ones((h//scale*font_size, w//scale*font_size), dtype=np.uint8)*255font = cv2.FONT_HERSHEY_SIMPLEX# 遍历图片像素for y in range(0, re_im.shape[0]):for x in range(0, re_im.shape[1]):char_pixel = pixel2char(re_im[y][x])cv2.putText(char_img, char_pixel, (x*font_size, y*font_size), font, 0.5, (0, 0, 0))return char_imgif __name__ == '__main__':img = cv2.imread('dl.jpg', 0)res = get_char_img(img)cv2.imwrite('d.jpg', res)

效果如下:

可以看到效果还是很不错的。

五、生成字符视频

有了上面的代码,我们就可以对整个视频进行转换了。将视频转换成字符视频的代码如下:

def generate(input_video, output_video):# 1、读取视频cap = cv2.VideoCapture(input_video)# 2、获取视频帧率fps = cap.get(cv2.CAP_PROP_FPS)# 读取第一帧,获取转换成字符后的图片的尺寸ret, frame = cap.read()char_img = get_char_img(cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY), 4)# 创建一个VideoWriter,用于保存视频fourcc = cv2.VideoWriter_fourcc(*'mp4v')writer = cv2.VideoWriter(output_video, fourcc, fps, (char_img.shape[1], char_img.shape[0]))while ret:# 读取视频的当前帧,如果没有则跳出循环ret, frame = cap.read()if not ret:break# 将当前帧转换成字符图gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)char_img = get_char_img(gray, 4)# 转换成BGR模式,便于写入视频char_img = cv2.cvtColor(char_img, cv2.COLOR_GRAY2BGR)writer.write(char_img)writer.release()

下面是卡卡西经典战役的字符视频片段:

完整代码如下:

import cv2
import numpy as npdef pixel2char(pixel):char_list = "@#$%&erytuioplkszxcv=+---.     "index = int(pixel / 256 * len(char_list))return char_list[index]def get_char_img(img, scale=4, font_size=5):# 调整图片大小h, w = img.shapere_im = cv2.resize(img, (w//scale, h//scale))# 创建一张图片用来填充字符char_img = np.ones((h//scale*font_size, w//scale*font_size), dtype=np.uint8)*255font = cv2.FONT_HERSHEY_SIMPLEX# 遍历图片像素for y in range(0, re_im.shape[0]):for x in range(0, re_im.shape[1]):char_pixel = pixel2char(re_im[y][x])cv2.putText(char_img, char_pixel, (x*font_size, y*font_size), font, 0.5, (0, 0, 0))return char_imgdef generate(input_video, output_video):# 1、读取视频cap = cv2.VideoCapture(input_video)# 2、获取视频帧率fps = cap.get(cv2.CAP_PROP_FPS)# 读取第一帧,获取转换成字符后的图片的尺寸ret, frame = cap.read()char_img = get_char_img(cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY), 4)# 创建一个VideoWriter,用于保存视频fourcc = cv2.VideoWriter_fourcc(*'mp4v')writer = cv2.VideoWriter(output_video, fourcc, fps, (char_img.shape[1], char_img.shape[0]))while ret:# 读取视频的当前帧,如果没有则跳出循环ret, frame = cap.read()if not ret:break# 将当前帧转换成字符图gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)char_img = get_char_img(gray, 4)# 转换成BGR模式,便于写入视频char_img = cv2.cvtColor(char_img, cv2.COLOR_GRAY2BGR)writer.write(char_img)writer.release()if __name__ == '__main__':generate('in.mp4', 'out.mp4')

我们只需要修改generate的参数就好了。完整效果视频如下:

Python生成字符视频-卡卡西VS带土

Python生成字符视频相关推荐

  1. 就有趣,Python生成字符视频

    Python生成字符视频 一.前言 在之前也写过生成字符视频的文章,但是使用的是命令行窗口输出,效果不是很好,而且存在卡顿的情况.于是我打算直接生成一个mp4的字符视频.大致思路和之前一样:Pytho ...

  2. Python 的一万种用法:生成字符视频

    作者 | ZackSock 来源 | 新建文件夹X 头图 | 下载于视觉中国 前言 在之前也写过生成字符视频的文章,但是使用的是命令行窗口输出,效果不是很好,而且存在卡顿的情况.于是我打算直接生成一个 ...

  3. python 制作字符视频_用Python生成抖音字符视频!

    抖音字符视频在去年火过一段时间. 反正我是始终忘不了那段极乐净土的音乐... 这一次自己也来实现一波,做一个字符视频出来. 主要用到的库有cv2,pillow库. 原视频如下,直接抖音下载的,妥妥的水 ...

  4. python生成字符画_Python生成字符画 | 文艺数学君

    摘要这一篇文章介绍使用Python生成字符画的方式. 会给出简单的原理介绍和实现的方式. 最后会给出源代码的链接地址. 简介 这一篇介绍一下使用Python来进行字符画的生成. 这里会介绍一下生成的步 ...

  5. 利用python生成字符画

    先看看效果图: 转换后: 将图片转换成字符画的原理: 先将图片转换成黑白,然后一行行的读取灰度,建立灰度与字符的映射. 转换代码: def transform(image_file): image_f ...

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

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

  7. 35行代码利用python生成字符画,非常适合初学者练习,附源码!

    python字符画是一个简单有趣的小程序,非常适合初学者进行学(zhuang)习(bi).python字符画生成的原理及其简单,一句话概括就是----将图片像素点用不同字符代替,从而将像素组成的图片转 ...

  8. 使用python生成文字视频

    网上有很多那种只有文字的视频,基本是都是一段文字,加上背景音乐,定时显示几个词语:好几次刷到这些视频,想到应该可以使用python生成: 基本原理 1.读取文本获取分词或分段列表 2.通过分词列表生成 ...

  9. python生成字符画_使用Python生成ASCII字符画

    使用Python生成ASCII字符画 在很多的网站主页中或者程序的注释中会有一些好看的字符注释画.显得很牛逼的样子 例如: 知乎 _____ _____ _____ _____ /\ \ /\ \ / ...

  10. python生成字符图形_【Python AsciiArt】利用命令行打印出字符图案

    利用字符串生成工具可以方便的打印出自己想要字符图案,以及如何将图片转换为ASCII ART输出. 最终可以用命令行输出各种彩色图像---->> 一般字符图案 我们在使用一些开源软件的时候, ...

最新文章

  1. 进来进程有人问表空间的迁移问题
  2. Java笔记(持续更新中)
  3. 梯度下降算法的简单证明
  4. 10月15日云栖精选夜读 | 阿里巴巴 Apache Dubbo 布道师谈 Service Mesh
  5. mysql是否有缓存区_Mysql查询高速缓存区
  6. boost::sort模块实现使用字符串键和索引函子对结构进行排序的示例
  7. Educational Codeforces Round 37 (Rated for Div. 2) E. Connected Components? 暴力 + 补图的遍历
  8. 《团队激励与沟通》第 7 讲——团队合作概述 重点部分总结
  9. 【开源】对基于图像背景的字体生成、人体姿势预测、关键点检测、超分辨率等探讨...
  10. 国外一些知名ASP.Net开源CMS系统
  11. php单字母函数(快捷方法)使用总结转载
  12. jquery.form 异步校验_利用jQuery.validate异步验证用户名是否存在
  13. yaml数组解析_Java使用snakeyaml解析yaml
  14. Ansys workbench有限元分析学习软件下载
  15. ESP定律脱压缩壳aspack
  16. 【学习记录】使用多协程和队列,爬取时光网电视剧TOP100的数据
  17. js输出sb (!(~+[]) + {})[--[~+][+[]] * [~+[]] + ~~!+[]] + ({} + [])[[~!+[]] * ~+[]] 图解
  18. Zookeeper 集群模式搭建
  19. dhrystone测试前系统软件准备与计算
  20. 数据埋点是什么?设置埋点的意义是什么?

热门文章

  1. .Net Core Pdf 转图片
  2. Android实现一个APP只能在一部手机上使用
  3. word设置表格文字紧贴下框线
  4. 《中国历史2000问》读后笔记
  5. 如何利用Excel公式制作日历
  6. SRGAN——使用与超分辨率重建的GAN
  7. C语言判断闰年计算某月的天数代码
  8. Java 关键字及其作用(保留字)
  9. 手机android系统锁了怎么解,安卓手机解锁图案忘了怎么办?手机解锁密码忘了的解决办法...
  10. eas账号是什么意思_账户和帐号是什么意思,有区别吗?