欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python實(shí)現(xiàn)視頻轉(zhuǎn)換為字符畫(huà)詳解

 更新時(shí)間:2021年12月14日 10:58:46   作者:微小冷  
這篇文章主要介紹了如何通過(guò)Python實(shí)現(xiàn)讀取視頻并將其轉(zhuǎn)換為字符畫(huà)的示例代碼,文中講解詳細(xì),對(duì)我們的學(xué)習(xí)和工作有一點(diǎn)的價(jià)值,感興趣的小伙伴可以了解一下

上次寫(xiě)了個(gè)華強(qiáng)買瓜字符視頻的帖子,下面有人問(wèn)如何保存,所以這次就寫(xiě)一個(gè)能將字符畫(huà)視頻保存下來(lái)的帖子,然而時(shí)不待我,華強(qiáng)紀(jì)元已經(jīng)結(jié)束,現(xiàn)在是穿山甲的時(shí)代了。

首先讀取視頻,并轉(zhuǎn)為字符。視頻是從B站下載的,地址《激戰(zhàn)江南》穿山甲名場(chǎng)面。

由于B站直接下載的視頻為flv格式,而imageio并不支持,盡管可以用opencv來(lái)讀取,但相比之下,用ffmepg轉(zhuǎn)個(gè)碼也不復(fù)雜,這樣可以最大限度地利用華強(qiáng)買瓜的代碼。

另外,視頻素材過(guò)長(zhǎng)不適合代碼演示,所以從第2:10進(jìn)行截取15s。

在命令行中輸入

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

很快就得到了seg.mp4,接下來(lái)就是讀取視頻并轉(zhuǎn)為字符,有關(guān)這部分代碼的解析,可出門(mén)左轉(zhuǎn)華強(qiáng)買瓜。

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

這個(gè)視頻對(duì)于字符畫(huà)而言太大了,所以轉(zhuǎn)字符畫(huà)之前需對(duì)其壓縮。這里采取最簡(jiǎn)單的方法——即對(duì)相鄰的像素取平均值。

#將圖像寬度縮小至width
from itertools import product   #用于循環(huán)嵌套
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) #取均值的步長(zhǎng)
    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
# 測(cè)試一下

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

接下來(lái)生成字符畫(huà),在此使用matplotlib中的text來(lái)進(jìn)行繪制,出于觀感考慮,取消了坐標(biāo)軸??紤]到字符畫(huà)需要寬度一致,故啟用本地字體。

關(guān)于繪圖字體,可參考python畫(huà)圖時(shí)調(diào)用本地字體

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'    #像素?fù)Q行時(shí)文本也要換行
    return txts

#測(cè)試
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()

結(jié)果如下

接下來(lái)就是動(dòng)起來(lái),對(duì)于老粉來(lái)說(shuō)這個(gè)顯然很簡(jiǎn)單,屬于PythonArt這個(gè)系列的傳統(tǒng)藝能了。。。

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

最終得到

到此這篇關(guān)于Python實(shí)現(xiàn)視頻轉(zhuǎn)換為字符畫(huà)詳解的文章就介紹到這了,更多相關(guān)Python視頻轉(zhuǎn)字符畫(huà)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論