日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Python20行代码实现视频字符化

發(fā)布時(shí)間:2024/9/15 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python20行代码实现视频字符化 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


Python20行代碼實(shí)現(xiàn)視頻字符化

我們經(jīng)常在B站上看到一些字符鬼畜視頻,主要就是將一個(gè)視頻轉(zhuǎn)換成字符的樣子展現(xiàn)出來(lái)。看起來(lái)是非常高端,但是實(shí)際實(shí)現(xiàn)起來(lái)確實(shí)非常簡(jiǎn)單,我們只需要接觸opencv模塊,就能很快的實(shí)現(xiàn)視頻字符化。但是在此之前,我們先看看我們實(shí)現(xiàn)的效果是怎樣的:

在這里插入圖片描述

上面就是截取的一部分效果圖,下面開(kāi)始進(jìn)入我們的主題。

一、OpenCV的安裝及圖片讀取

在Python中我們只需要用pip安裝即可,我們?cè)诳刂婆_(tái)執(zhí)行下列語(yǔ)句:

pip?install?opencv-python

安裝完成就可以開(kāi)始使用。我們先讀取一個(gè)圖片:

import?cv2 im?=?cv2.imread('jljt')????#?讀取圖片 cv2.imshow('im',?im)????#?顯示圖片 cv2.waitKey(0)????#?等待鍵盤(pán)輸入 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表示無(wú)限等待。因?yàn)閛pencv是使用c++編寫(xiě)的,所以我們需要銷毀內(nèi)存。

二、OpenCV中的一些基礎(chǔ)操作

我們將視頻字符化的思路就是先將視頻轉(zhuǎn)換為一幀一幀的圖像,然后對(duì)圖像進(jìn)行字符化處理,最后展示出來(lái)就是字符視頻的效果了。在我們生成字符畫(huà)之前,我們還要看一些OpenCV的操作。

(1)灰度轉(zhuǎn)換

灰度處理是一個(gè)非常常用的操作,我們?cè)嫉膱D片是有BGR三個(gè)圖層(在OpenCV中,圖像是以BGR形式讀取)。我們進(jìn)行灰度處理直觀上看就是將圖片變成黑白,而本質(zhì)上是將圖片的三個(gè)圖層通過(guò)計(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即可改變圖像大小:

import?cv2 #?讀取圖像 im?=?cv2.imread('jljt.png') #?改變圖像大小 re?=?cv2.resize(im,?(100,?40)) cv2.imshow('11',?re) cv2.waitKey(0) cv2.destroyAllWindows()

(2)逐幀讀取視頻

我們可以通過(guò)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()

有了上面的操作,我們就可以開(kāi)始我們下一步的工作了。

三、圖片字符化

對(duì)于只有一個(gè)通道的圖片,我們可以把它當(dāng)成一個(gè)矩形,這個(gè)矩形最小單位就是一個(gè)像素。而字符化的過(guò)程就是用字符替代像素點(diǎn)的過(guò)程。所以我們要遍歷圖像的每個(gè)像素點(diǎn),但是我們應(yīng)該用什么字符取代呢?

我們顏色有一個(gè)參照表,而opencv將這個(gè)參數(shù)表切割成256份,代表不同的程度,我們也可以做一個(gè)參照表,不過(guò)表中的內(nèi)容不是顏色,而是字符。

顏色表

上圖為顏色表,我們可以使顏色表和字符表建立映射關(guān)系。假如字符表如下:

mqpka89045321@#$%^&*()_=||||}

我們可以得到下列公式:

顏色和字符之間的等式

經(jīng)過(guò)變換可以求得相應(yīng)顏色對(duì)應(yīng)字符表中的字符:

獲取字符在字符表中的位置

這個(gè)公式不理解也沒(méi)關(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?=?''????#?用于裝字符畫(huà) for?i?in?grey:????#?遍歷每個(gè)像素for?j?in?i:index?=?int(j?/?256?*?len(str))????#?獲取字符坐標(biāo)str_img?+=?str[index]????#?將字符添加到字符畫(huà)中str_img?+=?'\n' print(str_img)

生成如下字符畫(huà):

字符畫(huà)

因?yàn)槌叽绫容^小的關(guān)系,看出來(lái)的效果不是很好,我們調(diào)節(jié)好大小就好了。

四、視頻轉(zhuǎn)字符

我們知道圖片轉(zhuǎn)字符,自然視頻轉(zhuǎn)字符就不是什么問(wèn)題了,我們只需要在逐幀讀取中執(zhí)行圖片字符化操作即可。

import?os import?cv2 str?=?'mqpka89045321@#$%^&*()_=||||}'????#?字符表 video?=?cv2.VideoCapture('jljt.mp4')?????#?讀取視頻 ret,?frame?=?video.read()????#?讀取幀 while?ret:????#?逐幀讀取str_img?=?''????#?字符畫(huà)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]????#?將字符添加到字符畫(huà)中str_img?+=?'\n'os.system('cls')????#?清除上一幀輸出的內(nèi)容print(str_img)????#?輸出字符畫(huà)ret,?frame?=?video.read()????#?讀取下一幀cv2.waitKey(5)

這樣我們就會(huì)每個(gè)5毫秒執(zhí)行一幀畫(huà)面,在我們使用pycharm執(zhí)行時(shí),會(huì)發(fā)現(xiàn)并沒(méi)有執(zhí)行清屏操作,所以我們需要到命令行運(yùn)行。最終效果就是我們的字符視頻了:

最終效果
在選取字符表時(shí)我們需要注意主體的顏色,如果主體顏色較淺,則字符表的尾部應(yīng)該為一些復(fù)雜字符,如:$%#@&。字符表頭部為一些簡(jiǎn)單字符,如:-|/等。如果主體顏色較深,而背景顏色較淺,則反之。當(dāng)然這沒(méi)有唯一的標(biāo)準(zhǔn),大家可以慢慢調(diào)節(jié)。感興趣的讀者,可以關(guān)注我的個(gè)人公眾號(hào):ZackSock,看到摳鼻屎的就是我沒(méi)錯(cuò)了。

? ???精 彩 文 章?

  • 抄作業(yè)了!6 大 Flask 開(kāi)源實(shí)戰(zhàn)項(xiàng)目推薦

  • 面試官問(wèn)我:如何設(shè)計(jì) QQ、微信等第三方賬號(hào)登陸 ?

  • VS Code 連接遠(yuǎn)程服務(wù)器運(yùn)行 Jupyter Notebook

END 最后說(shuō)個(gè)題外話,相信大家都知道視頻號(hào)了,隨著灰度范圍擴(kuò)大,越來(lái)越多的小伙伴都開(kāi)通了視頻號(hào)。小詹也開(kāi)通了一個(gè)視頻號(hào),會(huì)分享互聯(lián)網(wǎng)那些事、讀書(shū)心得與副業(yè)經(jīng)驗(yàn),歡迎掃碼關(guān)注,和小詹一起向上生長(zhǎng)!「沒(méi)有開(kāi)通發(fā)布權(quán)限的盡量多互動(dòng),提升活躍度可以更快開(kāi)通哦」

總結(jié)

以上是生活随笔為你收集整理的Python20行代码实现视频字符化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。