作者 | ZackSock

来源 | 新建文件夹X

头图 | 下载于视觉中国


前言

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

下面来看一个效果图:

卡卡西vs带土效果截取

OpenCV的操作图像

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

pip install opencv-python

之后就可以使用了。

1.1、读取和显示

我们直接看代码:

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

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

1.2、灰度转换

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

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

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

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

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

我们直接看代码:

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

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

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

1.4、绘制文字

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

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

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

1.5、读取视频

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

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()

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

1.6、写入视频

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

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()

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

卡卡西vs带土效果

完整代码如下:

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 爬影评,《悬崖之上》好看在哪里?热文 | 卷积神经网络入门案例,轻松实现花朵分类点分享点收藏点点赞点在看

Python 的一万种用法:生成字符视频相关推荐

  1. Python 的一万种用法:制作 Web 可视化页面

    来源 | 法纳斯特 头图 | 下载于ICphoto 一谈到Web页面,可能大家首先想到就是HTML.CSS或JavaScript. 本次小F给大家介绍一下如何用Python制作一个数据可视化网页,使用 ...

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

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

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

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

  4. 抖音上python_用Python生成抖音字符视频!

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

  5. 用Python生成抖音字符视频!

    作者 | 小F 来源 | 法纳斯特(公众号id:walker398) 抖音字符视频在去年火过一段时间.反正我是始终忘不了那段极乐净土的音乐...这一次自己也来实现一波,做一个字符视频出来.主要用到的库 ...

  6. python int转str_用Python生成抖音字符视频!

    作者 | 小 F 来源 | 法纳斯特 抖音字符视频在去年火过一段时间. 反正我是始终忘不了那段极乐净土的音乐... 这一次自己也来实现一波,做一个字符视频出来. 主要用到的库有cv2,pillow库. ...

  7. python宣传视频 抖音_Python生成抖音字符视频,技术流!

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

  8. python写抖音网站_用Python生成抖音字符视频!

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

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

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

最新文章

  1. c51矩形波输出汇编语言,51单片机汇编语言编程:用定时器控制输出矩形波
  2. 海量数据库解决方案2011031701
  3. BlockChain:《Blockchain Gate》听课笔记——区块链构筑的比特世界 VS 现实的原子世界
  4. CentOS更换网卡设置
  5. MCU VR班會(05)記錄
  6. soapUI-JDBC Request
  7. 客服跟踪记录管理php,用例管理平台维护记录,用例管理平台维护_PHP教程
  8. Python全栈开发之2、运算符与基本数据结构
  9. 洛谷 P2515 [HAOI2010]软件安装 解题报告
  10. dev gridcontrol 单元格内容复制_Excel中的复制粘贴,不只是你想的那么简单的
  11. python打开excel执行vba代码_xlwings:操作Excel,通过宏调用Pyhton(VBA调Python)-Go语言中文社区...
  12. 训练集与测试集数据分布不一致
  13. selenium进行网页长截图,模块长截图
  14. PUN ☀️九、玩家网络实例化与昵称显示
  15. Springboot+mybatis
  16. Windows10 mysql解决MySQL服务无法启动 系统出错 发生系统错误 1067
  17. xm-select getValue()获取不到值的解决方法
  18. 「入门运维必看」一篇让小白彻底搞懂性能调优!
  19. 幻灯片制作“高手”的自我总结
  20. 如何给自己的网站接入谷歌联盟

热门文章

  1. 刷前端面经笔记(七)
  2. Oracle优化器:星型转换
  3. docker的网络架构配置
  4. 所有 SAP 现在开设的标准课程
  5. How to never give up
  6. java指令集_javap 指令集
  7. 手机怎么访问kodi_Kodi播放器
  8. fig r函数_R语言基础绘图函数散点图~跟着Nature Communications学画图~Figure1
  9. jenkins pipeline脚本_Jenkins 创建流水线 (Pipeline) 项目的脚本
  10. 简单配置nginx反向代理,实现跨域请求