iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python生成字符视频的实现示例
  • 657
分享到

Python生成字符视频的实现示例

Python生成字符视频Python字符视频 2022-06-02 22:06:21 657人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

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

一、前言

在之前也写过生成字符视频的文章,但是使用的是命令行窗口输出,效果不是很好,而且存在卡顿的情况。于是我打算直接生成一个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:
        break
    else:
        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.shape
    re_im = cv2.resize(img, (w//scale, h//scale))
    # 创建一张图片用来填充字符
    char_img = np.ones((h//scale*font_size, w//scale*font_size), dtype=np.uint8)*255
    font = 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 np


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.shape
    re_im = cv2.resize(img, (w//scale, h//scale))
    # 创建一张图片用来填充字符
    char_img = np.ones((h//scale*font_size, w//scale*font_size), dtype=np.uint8)*255
    font = 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


if __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 np


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.shape
    re_im = cv2.resize(img, (w//scale, h//scale))
    # 创建一张图片用来填充字符
    char_img = np.ones((h//scale*font_size, w//scale*font_size), dtype=np.uint8)*255
    font = 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


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


if __name__ == '__main__':
    generate('in.mp4', 'out.mp4')

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

到此这篇关于Python生成字符视频的实现示例的文章就介绍到这了,更多相关Python生成字符视频内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python生成字符视频的实现示例

本文链接: https://www.lsjlt.com/news/10661.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#实现文字视频生成器的示例代码
    目录前言实现功能开发环境实现代码实现效果前言 简单的描述下写这个软件的背景吧。之前短视频平台很火的时候,相信很多人都想进去分一杯羹,俺当然也不能免俗,但是人丑家穷又没才艺,咋办呢?看...
    99+
    2024-04-02
  • python绘制字符画视频的示例代码
    目录 读取视频转为字符动画已经11月了,不知道还有没有人看华强买瓜。。。要把华强卖瓜做成字符视频,总共分为三步 读取视频 把每一帧转为字符画 把字...
    99+
    2024-04-02
  • Python实现视频下载与合成的示例代码
    目录模块使用开发环境案例实现1.明确需求2.代码实现步骤实现代码模块使用 requests >>> pip install requests (数据请求 第三方模块...
    99+
    2024-04-02
  • Python编程实现小姐姐跳舞并生成词云视频示例
    目录制作过程分为以下几个部分1、视频下载2、B 站弹幕下载3、视频切帧,人像分割4、对分割后的图像制作词云图5、图片拼接,合成视频最后 Python做了一个词云视频,以另一种角度来看...
    99+
    2024-04-02
  • python绘制字符画视频的示例代码怎么写
     读取视频通过imageio读取视频,除了pip install imageio之外,还需要pip install imageio-ffmpeg。由于视频中的图像都是彩色的,故而需要将rgb三色转为单一的强度,并将转化后的图像装入...
    99+
    2023-06-25
  • Python实现合并多张图片成视频的示例详解
    目录合并多张图片到视频的方法说明moviepy 将多张图片合成视频导入所需模块创建 ImageSequenceClip 对象保存视频moviepy 合成多张图片更多配置名词解释FFm...
    99+
    2023-02-01
    Python合并图片成视频 Python合并图片 Python 图片 视频
  • Python实现视频裁剪的示例代码
    目录前言环境依赖代码验证一下前言 本文提供将视频按照自定义尺寸进行裁剪的工具方法,一如既往的实用主义。 环境依赖 ffmpeg环境安装,可以参考文章:windows ffmpeg安装...
    99+
    2024-04-02
  • Python自动化短视频生成脚本实现热门视频流水线生产
    目录一、核心功能设计二、实现步骤1.图片爬取2.图片统一格式大小3.视频合成4.截取背景音乐5.视频和背景音乐合并一、核心功能设计 首先我看了网上那些视频营销号的视频,大多数都是围绕...
    99+
    2024-04-02
  • Python如何实现视频转换为字符画
    这篇文章给大家分享的是有关Python如何实现视频转换为字符画的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。首先读取视频,并转为字符。视频是从B站下载的,地址《激战江南》穿山甲名场面。由于B站直接下载的视频为fl...
    99+
    2023-06-22
  • Python实现视频转换为字符画详解
    上次写了个华强买瓜字符视频的帖子,下面有人问如何保存,所以这次就写一个能将字符画视频保存下来的帖子,然而时不待我,华强纪元已经结束,现在是穿山甲的时代了。 首先读取视频,并转为字符。...
    99+
    2024-04-02
  • Python实现视频分解成图片+图片合成视频
    目录一、python视频拆分+图片合成(源码一)1.python视频拆分2.python图片合成二、python视频拆分+图片合成(源码二)三、python视频拆分(源码三)一、py...
    99+
    2024-04-02
  • python生成随机数、随机字符、随机字符串的方法示例
    本文是基于Windows 10系统环境,实现python生成随机数、随机字符、随机字符串: Windows 10 PyCharm 2018.3.5 for Windows ...
    99+
    2024-04-02
  • Python实现多个视频合成一个视频的功能
    目录前言环境依赖代码验证一下前言 本文提供将多个视频拼接为一个视频的Python工具代码,其中有一些限制条件,下面的代码说明会提到。 环境依赖 ffmpeg环境安装,可以参考:win...
    99+
    2024-04-02
  • Python实现视频自动打码的示例代码
    目录序言准备工作实现原理模块素材工具代码解析完整代码序言 我们在观看视频的时候,有时候会出现一些奇怪的马赛克,影响我们的观影体验,那么这些马赛克是如何精确的加上去的呢? 本次我们就...
    99+
    2024-04-02
  • Python实现视频画质增强的示例代码
    目录前言原理实现步骤拆分处理合成效果总结前言 前面通过文章 几行代码,实现Python捕获、播放和保存摄像头视频!给大家介绍了如何读取、播放和保存视频,后面又通过文章&nb...
    99+
    2024-04-02
  • 利用Python实现普通视频变成动漫视频
    目录容我废话一下一、思路流程二、图像转动漫三、视频帧读取与视频帧写入容我废话一下 最近几个月,毒教材被曝光引发争议,那些编写度教材的人着实可恶。咱程序员也没有手绘插画能力,但咱可以借...
    99+
    2024-04-02
  • SpringBoot生成License的实现示例
    前言 License指的是版权许可证,当我们开发完系统后,如果不想让用户一直白嫖使用,比如说按时间续费,License的作用就有了。 我们可以给系统指定License的有效期,控制系...
    99+
    2024-04-02
  • Python怎么实现视频分解成图片及图片合成视频
    这篇文章主要介绍了Python怎么实现视频分解成图片及图片合成视频的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python怎么实现视频分解成图片及图片合成视频文章都会有所收获,下面我们一起来看看吧。一、pyt...
    99+
    2023-06-29
  • Python趣味编程实现手绘风视频示例
    在正文开始之前,先看一下最初效果,下面是单张图片转换前后对比 图一 图二 图三 为了增加趣味性,后面将这段代码应用到一个视频中,加上一个背景音乐,新鲜的 “手绘风视频” 出炉 ...
    99+
    2024-04-02
  • Python使用ffmpeg合成视频、音频的实现方法
    最近有在使用屏幕录制软件录制桌面,在用的过程中突发奇想,使用python能不能做屏幕录制工具,也锻炼下自己的动手能力。接下准备写使用python如何做屏幕录制工具的系列文章: 录制屏...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作