python繪制字符畫視頻的示例代碼

已經11月瞭,不知道還有沒有人看華強買瓜。。。要把華強賣瓜做成字符視頻,總共分為三步

  • 讀取視頻
  • 把每一幀轉為字符畫
  • 把字符畫表現出來

 讀取視頻

通過imageio讀取視頻,除瞭pip install imageio之外,還需要pip install imageio-ffmpeg

由於視頻中的圖像都是彩色的,故而需要將rgb三色轉為單一的強度,並將轉化後的圖像裝入一個列表中。

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

在這裡插入圖片描述

轉為字符

這個視頻雖然已被壓縮,但對於字符畫而言還是太大瞭,所以轉字符畫之前需對其進一步壓縮。這裡采取最簡單的方法——即對相鄰的像素取平均值。

#將圖像寬度縮小至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[0],160)
plt.imshow(im)
plt.show()

在這裡插入圖片描述

接下來,就可以生成字符畫瞭,所謂字符畫,無非是將像素值映射成一個字符,方法非常簡單

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

結果如下

在這裡插入圖片描述

動畫

讓命令行繪制字符視頻,聽上去可能有些不可思議,但這個功能可以僅憑python內置的模塊實現——即curses,唯一可惜的是,Windows下的Python並不內置這個模塊,需要額外安裝。

先下載和自己python版本相符的curses,然後通過pip命令安裝

>pip install "curses-2.2.1+utf8-cp310-cp310-win_amd64.whl"

然後就可以在python中調用瞭。由於視頻太大,所以這裡隻演示一小段,效果如下

在這裡插入圖片描述

主程序的代碼如下

if __name__ == "__main__":
    video = imageio.get_reader('test.mp4')
    txts = []
    # 生成字符畫
    for img in video:
        im = resizeImg(np.mean(img,2),120,30)
        txts.append(im2txt(im))

    # 初始化屏幕
    scr = curses.initscr()
    scr.timeout(40)     #每次等待鍵盤輸入的時間為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

到此這篇關於python繪制字符畫視頻的示例代碼的文章就介紹到這瞭,更多相關python 字符畫視頻內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: