20行Python代碼實(shí)現(xiàn)視頻字符化功能
我們經(jīng)常在B站上看到一些字符鬼畜視頻,主要就是將一個(gè)視頻轉(zhuǎn)換成字符的樣子展現(xiàn)出來??雌饋硎欠浅8叨耍菍?shí)際實(shí)現(xiàn)起來確是非常簡(jiǎn)單,我們只需要接觸opencv模塊,就能很快的實(shí)現(xiàn)視頻字符化。但是在此之前,我們先看看我們實(shí)現(xiàn)的效果是怎樣的:
上面就是截取的一部分效果圖,下面開始進(jìn)入我們的主題。
一、OpenCV的安裝及圖片讀取
在Python中我們只需要用pip安裝即可,我們?cè)诳刂婆_(tái)執(zhí)行下列語句:
pip install opencv-python
安裝完成就可以開始使用。我們先讀取一個(gè)圖片:
import cv2 im = cv2.imread('jljt') # 讀取圖片 cv2.imshow('im', im) # 顯示圖片 cv2.waitKey(0) # 等待鍵盤輸入 cv2.destroyAllWindows() # 銷毀內(nèi)存
首先我們使用cv2.imread
方法讀取圖片,該方法返回一個(gè)ndarray對(duì)象。然后調(diào)用imshow
方法顯示圖像,調(diào)用后會(huì)出現(xiàn)一個(gè)窗口,因?yàn)檫@個(gè)窗口只會(huì)出現(xiàn)一瞬間,所以我們調(diào)用waitKey
等待輸入,傳入0表示無限等待。因?yàn)?code>opencv是使用c++
編寫的,所以我們需要銷毀內(nèi)存。
二、OpenCV中的一些基礎(chǔ)操作
我們將視頻字符化的思路就是先將視頻轉(zhuǎn)換為一幀一幀的圖像,然后對(duì)圖像進(jìn)行字符化處理,最后展示出來就是字符視頻的效果了。在我們生成字符畫之前,我們還要看一些OpenCV
的操作。
(1)灰度轉(zhuǎn)換
灰度處理是一個(gè)非常常用的操作,我們?cè)嫉膱D片是有BGR三個(gè)圖層(在OpenCV中,圖像是以BGR形式讀?。?。我們進(jìn)行灰度處理直觀上看就是將圖片變成黑白,而本質(zhì)上是將圖片的三個(gè)圖層通過計(jì)算,變成一個(gè)圖層。而這種計(jì)算是不需要我們做的,我們只需要調(diào)用OpenCV中的函數(shù)即可:
import cv2 # 讀取圖片 im = cv2.imread('jljt.jpg') # 灰度轉(zhuǎn)換 grey = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
效果圖和原圖對(duì)比如下:
左邊為原圖,右邊為灰度轉(zhuǎn)換后的圖像。
(3)改變圖片大小
因?yàn)樽址髨D像會(huì)比較大,所以我們需要先縮小圖片,我們調(diào)用cv2.resize
即可改變圖像大?。?/p>
import cv2 # 讀取圖像 im = cv2.imread('jljt.png') # 改變圖像大小 re = cv2.resize(im, (100, 40)) cv2.imshow('11', re) cv2.waitKey(0) cv2.destroyAllWindows()
(2)逐幀讀取視頻
我們可以通過VideoCapture
讀取視頻,然后調(diào)用其中的方法讀取每一幀。
import cv2 # 讀取視頻 video = cv2.VideoCapture('jljt.mp4') # 讀取幀,該方法返回兩個(gè)參數(shù),第一個(gè)為是否還有下一幀,第二個(gè)為幀的ndarray對(duì)象 ret, frame = video.read() while ret: # 循環(huán)讀取幀 ret, frame = video.read()
有了上面的操作,我們就可以開始我們下一步的工作了。
三、圖片字符化
對(duì)于只有一個(gè)通道的圖片,我們可以把它當(dāng)成一個(gè)矩形,這個(gè)矩形最小單位就是一個(gè)像素。而字符化的過程就是用字符替代像素點(diǎn)的過程。所以我們要遍歷圖像的每個(gè)像素點(diǎn),但是我們應(yīng)該用什么字符取代呢?
我們顏色有一個(gè)參照表,而opencv將這個(gè)參數(shù)表切割成256份,代表不同的程度,我們也可以做一個(gè)參照表,不過表中的內(nèi)容不是顏色,而是字符。
上圖為顏色表,我們可以使顏色表和字符表建立映射關(guān)系。假如字符表如下:
mqpka89045321@#$%^&*()_=||||}
我們可以得到下列公式:
經(jīng)過變換可以求得相應(yīng)顏色對(duì)應(yīng)字符表中的字符:
這個(gè)公式不理解也沒關(guān)系,只需要會(huì)用即可。下面就是我們完整的代碼了:
import cv2 str = 'mqpka89045321@#$%^&*()_=||||}' # 字符表 im = cv2.imread('jljt.jpg') # 讀取圖像 grey = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) # 灰度轉(zhuǎn)換 grey = cv2.resize(grey, (50, 18)) # 縮小圖像 str_img = '' # 用于裝字符畫 for i in grey: # 遍歷每個(gè)像素 for j in i: index = int(j / 256 * len(str)) # 獲取字符坐標(biāo) str_img += str[index] # 將字符添加到字符畫中 str_img += '\n' print(str_img)
生成如下字符畫:
因?yàn)槌叽绫容^小的關(guān)系,看出來的效果不是很好,我們調(diào)節(jié)好大小就好了。
四、視頻轉(zhuǎn)字符
我們知道圖片轉(zhuǎn)字符,自然視頻轉(zhuǎn)字符就不是什么問題了,我們只需要在逐幀讀取中執(zhí)行圖片字符化操作即可。
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) # 灰度轉(zhuǎn)換 grey = cv2.resize(grey, (100, 40)) # 該表大小 for i in grey: # 遍歷每個(gè)像素點(diǎn) for j in i: index = int(j / 256 * len(str)) # 獲取字符坐標(biāo) str_img += str[index] # 將字符添加到字符畫中 str_img += '\n' os.system('cls') # 清除上一幀輸出的內(nèi)容 print(str_img) # 輸出字符畫 ret, frame = video.read() # 讀取下一幀 cv2.waitKey(5)
這樣我們就會(huì)每個(gè)5毫秒執(zhí)行一幀畫面,在我們使用pycharm執(zhí)行時(shí),會(huì)發(fā)現(xiàn)并沒有執(zhí)行清屏操作,所以我們需要到命令行運(yùn)行。最終效果就是我們的字符視頻了:
在選取字符表時(shí)我們需要注意主體的顏色,如果主體顏色較淺,則字符表的尾部應(yīng)該為一些復(fù)雜字符,如:$%#@&
。字符表頭部為一些簡(jiǎn)單字符,如:-|/
等。如果主體顏色較深,而背景顏色較淺,則反之。當(dāng)然這沒有唯一的標(biāo)準(zhǔn),大家可以慢慢調(diào)節(jié)。
總結(jié)
到此這篇關(guān)于20行Python代碼實(shí)現(xiàn)視頻字符化的文章就介紹到這了,更多相關(guān)python 視頻字符化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python numpy 點(diǎn)數(shù)組去重的實(shí)例
下面小編就為大家分享一篇Python numpy 點(diǎn)數(shù)組去重的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04python中ASCII碼字符與int之間的轉(zhuǎn)換方法
今天小編就為大家分享一篇python中ASCII碼字符與int之間的轉(zhuǎn)換方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07pip已經(jīng)安裝好第三方庫(kù)但pycharm中import時(shí)還是標(biāo)紅的解決方案
這篇文章主要介紹了python中pip已經(jīng)安裝好第三方庫(kù)但pycharm中import時(shí)還是標(biāo)紅的問題,本文給大家分享解決方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10簡(jiǎn)單實(shí)現(xiàn)python收發(fā)郵件功能
這篇文章主要教大家如何簡(jiǎn)單實(shí)現(xiàn)python收發(fā)郵件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01Python之Django自動(dòng)實(shí)現(xiàn)html代碼(下拉框,數(shù)據(jù)選擇)
這篇文章主要介紹了Python之Django自動(dòng)實(shí)現(xiàn)html代碼(下拉框,數(shù)據(jù)選擇),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03Python使用Bokeh進(jìn)行交互式數(shù)據(jù)可視化
Bokeh是一個(gè)Python庫(kù),用于在Web瀏覽器中創(chuàng)建交互式數(shù)據(jù)可視化,這篇文章主要為大家學(xué)習(xí)介紹了如何使用Bokeh實(shí)現(xiàn)回執(zhí)交互式數(shù)據(jù)可視化圖表,感興趣的可以學(xué)習(xí)一下2023-07-07