Python生成字符视频

一、前言

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

下面来看一个效果图:

卡卡西vs带土效果截取

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

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

卡卡西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的参数就好了。下面是完整的视频效果:

推荐阅读

Pandas处理数据太慢,来试试Polars吧!

懒人必备!只需一行代码,就能导入所有的Python库

绝!关于pip的15个使用小技巧

介绍10个常用的Python内置函数,99.99%的人都在用!

可能是全网最完整的 Python 操作 Excel库总结!

就有趣,Python生成字符视频相关推荐

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

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

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

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

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

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

  4. 利用python生成字符画

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

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

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

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

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

  7. 使用python生成文字视频

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

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

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

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

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

最新文章

  1. Java社区领袖介绍平台支持选项
  2. 微信分享转发功能「PHP版」
  3. gin自定义HTTP配置
  4. 67. Add Binary
  5. complementary prior
  6. Software Construction Series(1)
  7. python xml实例_python解析xml文档实例
  8. iOS 9之Safari广告拦截器(Content Blocker)
  9. 七岁OpenStack热情不减 如此执着为哪般?
  10. Hover属性的充分利用
  11. Spring,SpringMVC,SpringBoot,SpringCloud有什么区别和联系?
  12. linux/centos shell脚本中非交互式修改密码
  13. 数字图像算术编码python_算术编码简介
  14. @JSONField的一些使用基础
  15. [转载]静息态fMRI、DTI、VBM
  16. 基于Netty的RPC架构学习笔记(五):netty线程模型源码分析(二)
  17. 猿人学web端爬虫攻防大赛赛题解析_第九题:js混淆-动态cookie2
  18. [论文翻译]V-Net:Fully Convolutional Neural Networks for Volumetric Medical Image Segmentation
  19. 第一模块 jdk与jre、==与equals、Math.round(-1.5)、 String、操作字符串的类、字符串反转、抽象类必须要有抽象方法吗、普通类和抽象类、BIO NIO AIO
  20. 查看各类系统端口占用情况

热门文章

  1. redis-2.8.17安装指导(自己做测试了)
  2. 全面了解Nginx到底能做什么
  3. jQuery Vue的CDN
  4. 职称计算机应用能力考试模拟题,2016年职称计算机考试模拟题
  5. 拼装sql_SQL优化最干货总结(2020最新版)
  6. web api接口开发实例_C# 物联网开发API接口系列(4)
  7. matlab产生mif 文件,生成.mif文件的matlab程序
  8. 生命周期共有那几个阶段_用产品生命周期 6 个阶段来思考
  9. linux git文件图标,分享|三款 Linux 下的 Git 图形客户端
  10. python小数乘法_Polymorph:支持几乎所有现有协议的实时网络数据包操作框架