20行Python代碼實現視頻字符化

2020-12-08 騰訊網

來源 | ZackSock(ID:ZackSock)

我們經常在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)

效果圖和原圖對比如下:

左邊為原圖,右邊為灰度轉換後的圖像。

(2)改變圖片大小

因為字符化後圖像會比較大,所以我們需要先縮小圖片,我們調用cv2.resize即可改變圖像大小:

import cv2

# 讀取圖像

im = cv2.imread('jljt.png')

# 改變圖像大小

re = cv2.resize(im, (100, 40))

cv2.imshow('11', re)

cv2.waitKey(0)

cv2.destroyAllWindows()

(3)逐幀讀取視頻

我們可以通過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, (100, 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執行時,會發現並沒有執行清屏操作,所以我們需要到命令行運行。最終效果就是我們的字符視頻了:

最終效果

在選取字符表時我們需要注意主體的顏色,如果主體顏色較淺,則字符表的尾部應該為一些複雜字符,如:$%#@&。字符表頭部為一些簡單字符,如:-|/等。如果主體顏色較深,而背景顏色較淺,則反之。當然這沒有唯一的標準,大家可以慢慢調節。感興趣的讀者,可以關注我的個人公眾號:ZackSock,看到摳鼻屎的就是我沒錯了。

推薦閱讀

CycleGan人臉轉為漫畫臉,牛掰的知識又增加了 | 附代碼

一次對語音技術的徹底批判

360金融首席科學家張家興:別指望AI Lab做成中臺

為什麼說 C++ 太複雜?有必要這麼複雜嗎?| 原力計劃

關於Spring AOP,除了動態代理、CGLIB,你還知道什麼?

產業區塊鏈:新基建中的底層技術基座,各行業資深人士應積極參與建設

你點的每個「在看」,我都認真當成了AI

相關焦點

  • Python實現視頻裁剪添加水印功能
    今天來實現一個利用Python的moviepy類庫裁剪視頻的功能。寫這個功能的初衷是想批量的裁剪一下視頻,下面一起來看一下代碼吧!python目前我們實現的是將單獨一個視頻進行裁剪。本次我們將目前視頻截取一小段內容,並為其添加一個水印圖片。
  • 10行Python代碼也能實現,親測好用!
    大數據文摘出品編譯:朱一輝、雪清、小魚短短10行代碼就可以實現目標檢測?!本文作者和他的團隊構建了一個名為ImageAI 的Python庫,集成了現今流行的深度學習框架和計算機視覺庫。本文將手把手教你構建自己的第一個目標檢測應用,而且文摘菌已經幫你踩過坑了,親測有效!
  • 50 行代碼,實現中英文翻譯
    雖然現在有非常多的翻譯軟體,但通過自己動手寫個 python 小程序,是非常的有成就感。甚至你藉助今天的代碼,也可以自己開發個小型翻譯軟體。有道詞典接口今天的翻譯程序是借用有道翻譯的接口來實現的。程序代碼程序代碼很簡單,在相應的代碼裡我都有注釋。
  • 如何在 i5 上實現 20 倍的 Python 運行速度?
    他對外宣布:在配備四核 i5 的 iMAC 上實現了 20 倍的性能加速!至於他是怎麼做到的,請繼續往下看(含代碼)。James ReindersJames Reinders:利用 Intel Distribution for Python,我實現了 Python 的 20 倍加速,並且可用單個命令關閉/啟用。
  • 程式設計師的樂趣,生成自定義二維碼,5行Python代碼就搞定
    那麼有沒有辦法實現自定義生成二維碼呢?近日,一位熱衷於終身學習的工程師兼攝影師 Arindom Bhattacharjee 撰寫了一篇自定義生成二維碼的方法,並且整個生成過程只需要 5 行 Python 代碼即可完成。感興趣的讀者可以自己實現下。
  • 如何在Core i5 上實現 20 倍的 Python 運行速度?
    他對外宣布:在配備四核 i5 的 iMAC 上實現了 20 倍的性能加速! 至於他是怎麼做到的,請繼續往下看(含代碼)。
  • 代碼跑得慢甩鍋Python?手把手教你如何給代碼提速30%
    其實某個特定程序(無論使用何種程式語言)的運行速度是快還是慢,在很大程度上取決於編寫該程序的開發人員自身素質,以及他們編寫優化而高效代碼的能力。Medium上一位小哥就詳細講了講如何讓python提速30%,以此證明代碼跑得慢不是python的問題,而是代碼本身的問題。
  • Python:把視頻轉為Gif圖片
    今天,我就隆重給大家介紹下Python視頻製作利器:MoviePy,利用MoviePy就可以輕輕鬆鬆地實現。首先,我們先了解下,什麼是MoviePy。MoviePy是一個用於視頻編輯的python模塊,你可以用它實現一些基本的操作(比如視頻剪輯,視頻拼接,插入標題),實現視頻合成,也可以用它加入一些自定義的高級的特效。
  • 如何使用python語言代碼實現判斷是否為回文
    工具Visual Studio 2019python運行環境技術python回文回文,是按照中心對稱,從左到右或從右到左,字符串都一樣的。如果想要python語言代碼實現回文判斷,若為回文,列印回文,否則列印不是回文。
  • VPF:適用於 Python 的開源視頻處理框架,加速視頻任務、提高 GPU...
    同時,由於 Python 綁定下的 C ++代碼,它使開發者可以在數十行代碼中實現較高的 GPU 利用率。解碼後的視頻幀以 NumPy 數組或 CUDA 設備指針的形式公開,以簡化交互過程及其擴展功能。目前,VPF 並未對 NVIDIA Video Codec SDK 附加任何限制,開發者可充分利用 NVIDIA 專業級 GPU 的功能。
  • 40行Python代碼,實現卷積特徵可視化
    本文將向你解釋如何僅使用 40 行 Python 代碼將卷積特徵可視化。最近在閱讀 Jeremy Rifkin 的書《The End of Work》時,我讀到一個有趣的關於 AI 的定義。深度學習研究的目的是從數據中學習到目前為止還沒有自動化的流程的規則並實現自動化。雖然這聽起來並不是那麼讓人興奮,但它確實是一件好事。舉個例子:深度卷積神經網絡的出現徹底改變了計算機視覺和模式識別,這讓我們在醫療診斷中可以大量地引入自動化;人們可以加速為貧窮國家的人提供頂級醫療診斷,而不需要在本地培訓大量的醫生和專家。
  • 代碼詳解:Python虛擬環境的原理及使用
    全文共5308字,預計學習時長20分鐘或更長依附之門:「放棄進入這裡的所有希望。」插圖:Gustave DoréPython的虛擬環境極大地方便了人們的生活。本指南先介紹虛擬環境的基礎知識以及使用方法,然後再深入介紹虛擬環境背後的工作原理。
  • 《小灰教你零基礎學python》-Python入門語言
    這裡手機也是一樣的,手機可以看成縮小版本的電腦,也是有硬體和程序構成,硬體(按鍵、觸控螢幕、攝像頭、耳麥、電池、充電器)加上程序(日期時間、消息提示、微信、qq、騰訊視頻)。,其實理解咱這麼理解就行:咱們和外國人交流需要說英語,那麼咱們必須要學會英語才能和對方溝通;咱們需要讓電腦進行「溝通」就必須要使用程式語言。
  • 運用sklearn進行線性判別分析(LDA)代碼實現
    基於sklearn的線性判別分析(LDA)代碼實現一、前言及回顧本文記錄使用sklearn庫實現有監督的數據降維技術——線性判別分析(LDA)。在上一篇LDA線性判別分析原理及python應用(葡萄酒案例分析),我們通過詳細的步驟理解LDA內部邏輯實現原理,能夠更好地掌握線性判別分析的內部機制。
  • 一篇文章教你用11行Python代碼實現神經網絡
    聲明:本文是根據英文教程 (用 11 行 Python 代碼實現的神經網絡)學習總結而來,關於更詳細的神經網絡的介紹可以參考我的另一篇博客:。A Neural Network in 11 lines of Python從感知機到人工神經網絡如果你讀懂了下面的文章,你會對神經網絡有更深刻的認識,有任何問題,請多指教。
  • 一個Python GUI神器,雙手徹底解放!
    與直接使用基礎框架編寫代碼相比,PySimpleGUI代碼更簡單、更短,因為PySimpleGUI實現了許多「樣板代碼」,並且接口已被極大的簡化,用最少的代碼即可實現所需功能。PySimpleGUI含有成百上千的書面文檔頁面和示例程序,這將幫助我們快速有效地工作。
  • Python語言中使用pyqtgraph庫實現數據可視化
    背景在Python程式語言中,matplotlib是一種常用的用於數據可視化的繪圖庫,它提供了一套和matlab相似的命令API,開發者可以僅需幾行代碼,便可生成如直方圖,功率譜,條形圖,錯誤圖,散點圖等圖形,適用於交互式繪圖,而且也可以方便地將它作為繪圖控制項嵌入到GUI應用程式中
  • Python代碼性能調試和優化
    找出程序中影響程序性能的代碼。.prec -= 2return +sprint(exp(Decimal(150)))print(exp(Decimal(400)))print(exp(Decimal(3000)))最簡單的調試最簡單且實用的調試性能調試的方法是使用Linux的time命令,time可以計算程序執行的時間:time python3
  • Python OpenCV使用攝像頭捕獲視頻
    我們知道,OpenCV是一款強大的跨平臺的計算機視覺庫,使用它能完成我們對於圖像和視頻處理的很多功能,今天,我們使用OpenCV來捕獲計算機攝像頭的視頻。OpenCV恰好提供了對於視頻的捕捉、記錄、處理、存儲、傳送等功能。這一系列動作通過cv2.VideoCapture類來實現。它的原理基本上就是通過獲取視頻中的一系列禎來實現對於視頻的各種操作。
  • 基於python+OpenCV模塊的人臉識別定位技術
    本文將基於OpenCV模塊,在windows作業系統上,利用python語言,進行人臉識別技術的研究。當然OpenCV的應用領域很廣,除了人臉識別之外,它還支持圖像分割、動作識別、視頻處理等技術。代碼分析下面我們對代碼進行分析,代碼如圖所示:一共不超過15行,當然這是建立在別人已有的數據上做的,如果自己寫的話,不會這麼簡單,我們這只是調用了別人的接口,而這個接口是開源的,共享的。代碼第1行導入opencv模塊。