Python實(shí)現(xiàn)視頻轉(zhuǎn)換為字符畫(huà)詳解
上次寫(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)文章希望大家以后多多支持腳本之家!
- Python將圖片轉(zhuǎn)換為字符畫(huà)的方法
- Python實(shí)現(xiàn)圖片轉(zhuǎn)字符畫(huà)的代碼實(shí)例
- Python簡(jiǎn)單實(shí)現(xiàn)圖片轉(zhuǎn)字符畫(huà)的實(shí)例項(xiàng)目
- Python制作動(dòng)態(tài)字符畫(huà)的源碼
- python繪制字符畫(huà)視頻的示例代碼
- 基于Python實(shí)現(xiàn)視頻轉(zhuǎn)字符畫(huà)動(dòng)漫小工具
- 用Python字符畫(huà)出了一個(gè)谷愛(ài)凌
- 利用Python字符畫(huà)生成甜心教主
- 如何利用python實(shí)現(xiàn)圖片轉(zhuǎn)化字符畫(huà)
相關(guān)文章
使用python對(duì)文件中的單詞進(jìn)行提取的方法示例
這篇文章主要介紹了使用python對(duì)文件中的單詞進(jìn)行提取的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12對(duì)比Python中__getattr__和 __getattribute__獲取屬性的用法
這篇文章主要介紹了對(duì)比Python中__getattr__和 __getattribute__獲取屬性的用法,注意二者間的區(qū)別,__getattr__只作用于不存在的屬性,需要的朋友可以參考下2016-06-06python中reversed與reverse的區(qū)別解析
reverse()是python中列表的一個(gè)內(nèi)置方法(在字典、字符串和元組中沒(méi)有這個(gè)內(nèi)置方法),用于列表中數(shù)據(jù)的反轉(zhuǎn),這篇文章主要介紹了python中reversed與reverse的區(qū)別,需要的朋友可以參考下2023-03-03三個(gè)python爬蟲(chóng)項(xiàng)目實(shí)例代碼
這篇文章主要介紹了三個(gè)python爬蟲(chóng)項(xiàng)目實(shí)例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12PyQt5 關(guān)于Qt Designer的初步應(yīng)用和打包過(guò)程詳解
Qt Designer中的操作方式十分靈活,其通過(guò)拖拽的方式放置控件可以隨時(shí)查看控件效果。這篇文章主要介紹了PyQt5 關(guān)于Qt Designer的初步應(yīng)用和打包,需要的朋友可以參考下2021-09-09python辦公自動(dòng)化之讀取本地OUTLOOK客戶端郵件
這篇文章主要為大家詳細(xì)介紹了如何使用python實(shí)現(xiàn)讀取本地OUTLOOK客戶端郵件,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的小伙伴可以了解下2023-10-10Python機(jī)器學(xué)習(xí)pytorch模型選擇及欠擬合和過(guò)擬合詳解
如何發(fā)現(xiàn)可以泛化的模式是機(jī)器學(xué)習(xí)的根本問(wèn)題,將模型在訓(xùn)練數(shù)據(jù)上過(guò)擬合得比潛在分布中更接近的現(xiàn)象稱為過(guò)擬合,用于對(duì)抗過(guò)擬合的技術(shù)稱為正則化2021-10-10Python matplotlib 畫(huà)圖窗口顯示到gui或者控制臺(tái)的實(shí)例
今天小編就為大家分享一篇Python matplotlib 畫(huà)圖窗口顯示到gui或者控制臺(tái)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05python topN 取最大的N個(gè)數(shù)或最小的N個(gè)數(shù)方法
今天小編就為大家分享一篇python topN 取最大的N個(gè)數(shù)或最小的N個(gè)數(shù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06