20行Python程式碼實現視訊字元化功能
我們經常在B站上看到一些字元鬼畜視訊,主要就是將一個視訊轉換成字元的樣子展現出來。看起來是非常高階,但是實際實現起來確是非常簡單,我們只需要接觸opencv模組,就能很快的實現視訊字元化。但是在此之前,我們先看看我們實現的效果是怎樣的:
上面就是擷取的一部分效果圖,下面開始進入我們的主題。
一、OpenCV的安裝及圖片讀取
在Python中我們只需要用pip安裝即可,我們在控制檯執行下列語句:
pip install opencv-python
安裝完成就可以開始使用。我們先讀取一個圖片:
import cv2 im = cv2.imread('jljt') # 讀取圖片 cv2.imshow('im',im) # 顯示圖片 cv2.waitKey(0) # 等待鍵盤輸入 cv2.destroyAllWindows() # 銷燬記憶體
首先我們使用cv2.imread
方法讀取圖片,該方法返回一個ndarray物件。然後呼叫imshow
方法顯示影象,呼叫後會出現一個視窗,因為這個視窗只會出現一瞬間,所以我們呼叫waitKey
等待輸入,傳入0表示無限等待。因為opencv
是使用c++
編寫的,所以我們需要銷燬記憶體。
二、OpenCV中的一些基礎操作
我們將視訊字元化的思路就是先將視訊轉換為一幀一幀的影象,然後對影象進行字元化處理,最後展示出來就是字元視訊的效果了。在我們生成字元畫之前,我們還要看一些OpenCV
的操作。
(1)灰度轉換
灰度處理是一個非常常用的操作,我們原始的圖片是有BGR三個圖層(在OpenCV中,影象是以BGR形式讀取)。我們進行灰度處理直觀上看就是將圖片變成黑白,而本質上是將圖片的三個圖層通過計算,變成一個圖層。而這種計算是不需要我們做的,我們只需要呼叫OpenCV中的函式即可:
import cv2 # 讀取圖片 im = cv2.imread('jljt.jpg') # 灰度轉換 grey = cv2.cvtColor(frame,cv2.COLOR_RGB2GRAY)
效果圖和原圖對比如下:
左邊為原圖,右邊為灰度轉換後的影象。
(3)改變圖片大小
因為字元化後圖像會比較大,所以我們需要先縮小圖片,我們呼叫cv2.resize
即可改變影象大小:
import cv2 # 讀取影象 im = cv2.imread('jljt.png') # 改變影象大小 re = cv2.resize(im,(100,40)) cv2.imshow('11',re) cv2.waitKey(0) cv2.destroyAllWindows()
(2)逐幀讀取視訊
我們可以通過VideoCapture
讀取視訊,然後呼叫其中的方法讀取每一幀。
import cv2 # 讀取視訊 video = cv2.VideoCapture('jljt.mp4') # 讀取幀,該方法返回兩個引數,第一個為是否還有下一幀,第二個為幀的ndarray物件 ret,frame = video.read() while ret: # 迴圈讀取幀 ret,frame = video.read()
有了上面的操作,我們就可以開始我們下一步的工作了。
三、圖片字元化
對於只有一個通道的圖片,我們可以把它當成一個矩形,這個矩形最小單位就是一個畫素。而字元化的過程就是用字元替代畫素點的過程。所以我們要遍歷影象的每個畫素點,但是我們應該用什麼字元取代呢?
我們顏色有一個參照表,而opencv將這個引數表切割成256份,代表不同的程度,我們也可以做一個參照表,不過表中的內容不是顏色,而是字元。
上圖為顏色表,我們可以使顏色表和字元表建立對映關係。假如字元表如下:
mqpka89045321@#$%^&*()_=||||}
我們可以得到下列公式:
經過變換可以求得相應顏色對應字元表中的字元:
這個公式不理解也沒關係,只需要會用即可。下面就是我們完整的程式碼了:
import cv2 str = 'mqpka89045321@#$%^&*()_=||||}' # 字元表 im = cv2.imread('jljt.jpg') # 讀取影象 grey = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) # 灰度轉換 grey = cv2.resize(grey,(50,18)) # 縮小影象 str_img = '' # 用於裝字元畫 for i in grey: # 遍歷每個畫素 for j in i: index = int(j / 256 * len(str)) # 獲取字元座標 str_img += str[index] # 將字元新增到字元畫中 str_img += '\n' print(str_img)
生成如下字元畫:
因為尺寸比較小的關係,看出來的效果不是很好,我們調節好大小就好了。
四、視訊轉字元
我們知道圖片轉字元,自然視訊轉字元就不是什麼問題了,我們只需要在逐幀讀取中執行圖片字元化操作即可。
import os import cv2 str = 'mqpka89045321@#$%^&*()_=||||}' # 字元表 video = cv2.VideoCapture('jljt.mp4') # 讀取視訊 ret,frame = video.read() # 讀取幀 while ret: # 逐幀讀取 str_img = '' # 字元畫 grey = cv2.cvtColor(frame,cv2.COLOR_RGB2GRAY) # 灰度轉換 grey = cv2.resize(grey,40)) # 該表大小 for i in grey: # 遍歷每個畫素點 for j in i: index = int(j / 256 * len(str)) # 獲取字元座標 str_img += str[index] # 將字元新增到字元畫中 str_img += '\n' os.system('cls') # 清除上一幀輸出的內容 print(str_img) # 輸出字元畫 ret,frame = video.read() # 讀取下一幀 cv2.waitKey(5)
這樣我們就會每個5毫秒執行一幀畫面,在我們使用pycharm執行時,會發現並沒有執行清屏操作,所以我們需要到命令列執行。最終效果就是我們的字元視訊了:
在選取字元表時我們需要注意主體的顏色,如果主體顏色較淺,則字元表的尾部應該為一些複雜字元,如:$%#@&
。字元表頭部為一些簡單字元,如:-|/
等。如果主體顏色較深,而背景顏色較淺,則反之。當然這沒有唯一的標準,大家可以慢慢調節。
總結
到此這篇關於20行Python程式碼實現視訊字元化的文章就介紹到這了,更多相關python 視訊字元化內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!