已經(jīng)11月了,不知道還有沒(méi)有人看華強(qiáng)買(mǎi)瓜。。。要把華強(qiáng)賣(mài)瓜做成字符視頻,總共分為三步:
- 讀取視頻
- 把每一幀轉(zhuǎn)為字符畫(huà)
- 把字符畫(huà)表現(xiàn)出來(lái)
讀取視頻
通過(guò)imageio讀取視頻,除了pip install imageio之外,還需要pip install imageio-ffmpeg。
由于視頻中的圖像都是彩色的,故而需要將rgb三色轉(zhuǎn)為單一的強(qiáng)度,并將轉(zhuǎn)化后的圖像裝入一個(gè)列表中。
import imageio import numpy as np import matplotlib.pyplot as plt video = imageio.get_reader('test.mp4') imgs = [] for img in video: imgs.append(np.mean(img,2)) plt.imshow(imgs[0]) plt.show()
轉(zhuǎn)為字符
這個(gè)視頻雖然已被壓縮,但對(duì)于字符畫(huà)而言還是太大了,所以轉(zhuǎn)字符畫(huà)之前需對(duì)其進(jìn)一步壓縮。這里采取最簡(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[0],160) plt.imshow(im) plt.show()
接下來(lái),就可以生成字符畫(huà)了,所謂字符畫(huà),無(wú)非是將像素值映射成一個(gè)字符,方法非常簡(jiǎn)單
pixels = "~K圖???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) print(txt)
結(jié)果如下
動(dòng)畫(huà)
讓命令行繪制字符視頻,聽(tīng)上去可能有些不可思議,但這個(gè)功能可以?xún)H憑python內(nèi)置的模塊實(shí)現(xiàn)――即curses,唯一可惜的是,Windows下的Python并不內(nèi)置這個(gè)模塊,需要額外安裝。
先下載和自己python版本相符的curses,然后通過(guò)pip命令安裝
>pip install "curses-2.2.1+utf8-cp310-cp310-win_amd64.whl"
然后就可以在python中調(diào)用了。由于視頻太大,所以這里只演示一小段,效果如下
主程序的代碼如下
if __name__ == "__main__": video = imageio.get_reader('test.mp4') txts = [] # 生成字符畫(huà) for img in video: im = resizeImg(np.mean(img,2),120,30) txts.append(im2txt(im)) # 初始化屏幕 scr = curses.initscr() scr.timeout(40) #每次等待鍵盤(pán)輸入的時(shí)間為40ms #scr. for txt in cycle(txts): scr.addstr(0,0,txt) scr.border(0) scr.refresh() #curses.delay_output(25) if scr.getch()==27: #如果按下`esc`則退出` break
完整代碼
到此這篇關(guān)于通過(guò)python繪制華強(qiáng)買(mǎi)瓜的字符畫(huà)視頻的文章就介紹到這了,更多相關(guān)python華強(qiáng)買(mǎi)瓜字符畫(huà)視頻內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/m0_37816922/article/details/121296343