Python實現(xiàn)視頻轉(zhuǎn)換為字符畫詳解
上次寫了個華強買瓜字符視頻的帖子,下面有人問如何保存,所以這次就寫一個能將字符畫視頻保存下來的帖子,然而時不待我,華強紀元已經(jīng)結(jié)束,現(xiàn)在是穿山甲的時代了。
首先讀取視頻,并轉(zhuǎn)為字符。視頻是從B站下載的,地址《激戰(zhàn)江南》穿山甲名場面。
由于B站直接下載的視頻為flv格式,而imageio并不支持,盡管可以用opencv來讀取,但相比之下,用ffmepg轉(zhuǎn)個碼也不復雜,這樣可以最大限度地利用華強買瓜的代碼。
另外,視頻素材過長不適合代碼演示,所以從第2:10進行截取15s。
在命令行中輸入
>pip install ffmpeg >ffmpeg -i soup.flv -ss 00:02:10 -t 15 seg.mp4 -y
很快就得到了seg.mp4,接下來就是讀取視頻并轉(zhuǎn)為字符,有關(guān)這部分代碼的解析,可出門左轉(zhuǎn)華強買瓜。
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()

這個視頻對于字符畫而言太大了,所以轉(zhuǎn)字符畫之前需對其壓縮。這里采取最簡單的方法——即對相鄰的像素取平均值。
#將圖像寬度縮小至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) #取均值的步長
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來進行繪制,出于觀感考慮,取消了坐標軸??紤]到字符畫需要寬度一致,故啟用本地字體。
關(guān)于繪圖字體,可參考python畫圖時調(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' #像素換行時文本也要換行
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()
結(jié)果如下

接下來就是動起來,對于老粉來說這個顯然很簡單,屬于PythonArt這個系列的傳統(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實現(xiàn)視頻轉(zhuǎn)換為字符畫詳解的文章就介紹到這了,更多相關(guān)Python視頻轉(zhuǎn)字符畫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
對比Python中__getattr__和 __getattribute__獲取屬性的用法
這篇文章主要介紹了對比Python中__getattr__和 __getattribute__獲取屬性的用法,注意二者間的區(qū)別,__getattr__只作用于不存在的屬性,需要的朋友可以參考下2016-06-06
python中reversed與reverse的區(qū)別解析
reverse()是python中列表的一個內(nèi)置方法(在字典、字符串和元組中沒有這個內(nèi)置方法),用于列表中數(shù)據(jù)的反轉(zhuǎn),這篇文章主要介紹了python中reversed與reverse的區(qū)別,需要的朋友可以參考下2023-03-03
PyQt5 關(guān)于Qt Designer的初步應(yīng)用和打包過程詳解
Qt Designer中的操作方式十分靈活,其通過拖拽的方式放置控件可以隨時查看控件效果。這篇文章主要介紹了PyQt5 關(guān)于Qt Designer的初步應(yīng)用和打包,需要的朋友可以參考下2021-09-09
Python機器學習pytorch模型選擇及欠擬合和過擬合詳解
如何發(fā)現(xiàn)可以泛化的模式是機器學習的根本問題,將模型在訓練數(shù)據(jù)上過擬合得比潛在分布中更接近的現(xiàn)象稱為過擬合,用于對抗過擬合的技術(shù)稱為正則化2021-10-10
Python matplotlib 畫圖窗口顯示到gui或者控制臺的實例
今天小編就為大家分享一篇Python matplotlib 畫圖窗口顯示到gui或者控制臺的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
python topN 取最大的N個數(shù)或最小的N個數(shù)方法
今天小編就為大家分享一篇python topN 取最大的N個數(shù)或最小的N個數(shù)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06

