Python实现视频转换为字符画详解

 更新时间:2021年12月14日 10:58:46   作者:微小冷  
这篇文章主要介绍了如何通过Python实现读取视频并将其转换为字符画的示例代码,文中讲解详细,对我们的学习和工作有一点的价值,感兴趣的小伙伴可以了解一下

上次写了个华强买瓜字符视频的帖子,下面有人问如何保存,所以这次就写一个能将字符画视频保存下来的帖子,然而时不待我,华强纪元已经结束,现在是穿山甲的时代了。

首先读取视频,并转为字符。视频是从B站下载的,地址《激战江南》穿山甲名场面

由于B站直接下载的视频为flv格式,而imageio并不支持,尽管可以用opencv来读取,但相比之下,用ffmepg转个码也不复杂,这样可以最大限度地利用华强买瓜的代码。

另外,视频素材过长不适合代码演示,所以从第2:10进行截取15s。

在命令行中输入

>pip install ffmpeg
>ffmpeg  -i soup.flv -ss 00:02:10 -t 15 seg.mp4 -y

很快就得到了seg.mp4,接下来就是读取视频并转为字符,有关这部分代码的解析,可出门左转华强买瓜

import imageio
import numpy as np
import matplotlib.pyplot as plt
video = imageio.get_reader('seg.mp4')
imgs = [np.mean(im,2) for im in video]
plt.imshow(imgs[30])
plt.show()

这个视频对于字符画而言太大了,所以转字符画之前需对其压缩。这里采取最简单的方法——即对相邻的像素取平均值。

#将图像宽度缩小至width
from itertools import product   #用于循环嵌套
def resizeImg(img,w,h=None):
    m,n = img.shape
    if n<w:
        return img
    if not h:
        h = int(m*w/n)
    im = np.zeros([h,w])
    rw,rh = n/w,m/h         #缩放比例
    dw,dh = int(rw),int(rh) #取均值的步长
    for i,j in product(range(h),range(w)):
        I,J = int(i*rh),int(j*rw)
        im[i,j] = np.mean(img[I:I+dh,J:J+dw])
    return im
# 测试一下

im = resizeImg(imgs[30],160)
plt.imshow(im)
plt.show()

接下来生成字符画,在此使用matplotlib中的text来进行绘制,出于观感考虑,取消了坐标轴。考虑到字符画需要宽度一致,故启用本地字体。

关于绘图字体,可参考python画图时调用本地字体

pixels = "B8&WMZO0QJX@%&jfoavunxr#t/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ^`'. " #用于映射的字符

def im2txt(img):
    im = np.floor(img/255*len(pixels)).astype(int)
    txts = ""
    for line in im:
        txts += "".join([pixels[i] for i in line])
        txts += '\r\n'    #像素换行时文本也要换行
    return txts

#测试
txt = im2txt(im)

plt.figure(figsize=(8,4.5))
plt.rcParams['font.sans-serif'] = 'SIMSUN'  #SIMSUN为宋体
plt.axis([0,10,0,10])
_ = plt.text(5, 5, txt, fontsize=6, linespacing=0.6,ha='center', va='center',wrap=True)
plt.gca().set_axis_off()
plt.show()

结果如下

接下来就是动起来,对于老粉来说这个显然很简单,属于PythonArt这个系列的传统艺能了。。。

from matplotlib import animation
fig = plt.figure(figsize=(8,4.5))
plt.rcParams['font.sans-serif'] = 'SIMSUN'
ax = fig.add_subplot(xlim=(0,10),ylim=(0,10))
ax.set_axis_off()

text = ax.text(5, 5, txt, fontsize=6, linespacing=0.6,  ha='center', va='center',wrap=True)

def animate(im):
    text.set_text(im2txt(im))
    return [text]

imgs = [resizeImg(im,160) for im in imgs]

ani = animation.FuncAnimation(fig, animate, imgs[:200], interval=10, blit=True)

plt.show()

最终得到

到此这篇关于Python实现视频转换为字符画详解的文章就介绍到这了,更多相关Python视频转字符画内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python实现二分法查找及优化的示例详解

    Python实现二分法查找及优化的示例详解

    二分查找法(Binary Search)是一种在有序数组中查找某一特定元素的算法,在本文中,我们将使用 Python 实现二分查找算法,并深入探讨算法的原理和实现细节,感兴趣的可以了解一下
    2023-04-04
  • pytorch中的卷积和池化计算方式详解

    pytorch中的卷积和池化计算方式详解

    今天小编就为大家分享一篇pytorch中的卷积和池化计算方式详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • Python2.5/2.6实用教程 入门基础篇

    Python2.5/2.6实用教程 入门基础篇

    本文方便有经验的程序员进入Python世界.本文适用于python2.5/2.6版本.
    2009-11-11
  • 简单了解Pandas缺失值处理方法

    简单了解Pandas缺失值处理方法

    这篇文章主要介绍了简单了解Pandas缺失值处理方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Python正则表达式匹配日期与时间的方法

    Python正则表达式匹配日期与时间的方法

    这篇文章主要介绍了Python正则表达式匹配日期与时间的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • python笔记之使用fillna()填充缺失值

    python笔记之使用fillna()填充缺失值

    这篇文章主要介绍了python笔记之使用fillna()填充缺失值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • python生成圆形图片的方法

    python生成圆形图片的方法

    这篇文章主要为大家详细介绍了python生成圆形图片的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 对python3中的RE(正则表达式)-详细总结

    对python3中的RE(正则表达式)-详细总结

    今天小编就为大家分享一篇对python3中的RE(正则表达式)-详细总结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • numpy:找到指定元素的索引示例

    numpy:找到指定元素的索引示例

    今天小编就为大家分享一篇numpy:找到指定元素的索引示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • python使用 __init__初始化操作简单示例

    python使用 __init__初始化操作简单示例

    这篇文章主要介绍了python使用 __init__初始化操作,结合实例形式分析了Python面向对象程序设计中使用__init__进行初始化操作相关技巧与注意事项,需要的朋友可以参考下
    2019-09-09

最新评论