摘要:一幅圖像全部轉(zhuǎn)成字符序列后,就可以直接在控制臺輸出了。讀取視頻使用了,并直接用它提供的方法轉(zhuǎn)了灰度圖,在之前的文章中也有過介紹,計算機(jī)視覺開發(fā)利器這一步比較重要,因為有的視頻分辨率很高,直接一個像素轉(zhuǎn)一個字符的話量太大,所以先縮小圖片。
今天分享的這段代碼,看起來沒啥實際用處,而且有些反潮流,因為現(xiàn)如今大家看視頻都追求更高分辨率的超清畫質(zhì),而我們這個,是 一個“超不清”的視頻播放器 :
在控制臺里播放視頻,用字符來表示畫面
不過我覺得它至少可以有三個作用:1.用來 練習(xí)視頻和圖像處理 的編程開發(fā);2. 在沒有圖形界面的服務(wù)器上播放視頻 (雖然效果不咋地);3.作為一種獨特的 藝術(shù)風(fēng)格化 處理
程序的原理其實很簡單,關(guān)鍵是你要理解 計算機(jī)中一張圖像的組成:一堆像素點。 我們平常說的 1920*1080 之類的分辨率,也就是指這個像素點的多少。我們想做成字符畫,也就是考慮如何用不同的字符來表示一個像素。
通常 一個像素點由3個0~255的值表示 ,分別表示 紅、綠、藍(lán)三種顏色值 ,值越大表示顏色越深。但字符畫是沒有顏色的,所以需要將圖像 轉(zhuǎn)成灰度圖 ,這樣就可以跟一組從深到淺的字符形成一種對應(yīng)關(guān)系。比如深的點就是 @,淺色的點就是 .。
一幅圖像全部轉(zhuǎn)成字符序列后,就可以直接在控制臺輸出了。對于一個視頻來說,只需要將每一幀都轉(zhuǎn)換后輸出,并按照一定的時間間隔清屏、輸出下一幀,即可達(dá)到我們的需要的效果。
轉(zhuǎn)換后的效果:
代碼:
# coding: utf8 import cv2 as cv import os import time # 替換字符列表 ascii_char = list(r"$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^`". ") char_len = len(ascii_char) # 加載視頻 cap = cv.VideoCapture("video.mp4") while True: # 讀取視頻每一幀 hasFrame, frame = cap.read() if not hasFrame: break # 視頻長寬 width = frame.shape[0] height = frame.shape[1] # 轉(zhuǎn)灰度圖 img_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # 縮小圖片并調(diào)整長寬比 img_resize = cv.resize(img_gray, (int(width / 10), int(height / 10))) text = "" # 遍歷圖片中的像素 for row in img_resize: for pixel in row: # 根據(jù)像素值,選取對應(yīng)的字符 text += ascii_char[int(pixel / 256 * char_len)] text += " " # 清屏 os.system("cls") # mac是"clear" # 輸出生成的字符方陣 print(text) # 適當(dāng)暫停一下 time.sleep(0.03)
代碼不長,稍微解釋下其中幾處:
ascii_char 這個字符序列并不是必須這樣,只要大致上滿足其中的 字符看起來從深到淺 即可,字符越多越準(zhǔn)確,效果就越好。
讀取視頻使用了 opencv-python ,并直接用它提供的方法轉(zhuǎn)了灰度圖,在之前的文章中也有過介紹:OpenCV-Python,計算機(jī)視覺開發(fā)利器
resize 這一步比較重要,因為有的視頻分辨率很高,直接一個像素轉(zhuǎn)一個字符的話量太大,所以 先縮小圖片 。另一個原因是字符一般都不是正方形,所以在 圖片長寬比上要做一定的調(diào)整 ,這樣最終效果比較好。(實際中要根據(jù)你自己控制臺中的字體效果來調(diào)整縮放比例)
ascii_char[int(pixel / 256 * char_len)] 是整個轉(zhuǎn)換的核心,因為一個像素的顏色范圍是 0~255,通過 pixel / 256 * char_len 可以 將一個像素值對應(yīng)于字符序列中灰度相當(dāng)?shù)淖址?/strong> 。
關(guān)于輸出,有幾個值得注意的點: 輸出一幀前需要清屏 ,不同平臺命令有區(qū)別; 時間間隔、控制臺的字體大小、縮放比例都要根據(jù)實際情況作調(diào)整 ;如果計算時間過長、刷新太慢而屏幕閃爍,可以考慮進(jìn)一步縮小圖片,或者先將所以幀轉(zhuǎn)換完畢后再統(tǒng)一輸出。
最后請各位欣賞最終的視頻效果:
《極樂凈土》字符版 https://www.zhihu.com/video/1063899647084568576
文中完整代碼已上傳,包括 轉(zhuǎn)單張圖片 和 轉(zhuǎn)視頻 兩份代碼。
獲取地址請在公眾號“ Crossin的編程教室 ”里回復(fù)關(guān)鍵字 播放器
════
其他文章及回答:
如何自學(xué)Python | 新手引導(dǎo) | 精選Python問答 | Python單詞表 | 人工智能 | 爬蟲 | 我用Python | requests | 計算機(jī)視覺
歡迎搜索及關(guān)注公眾號: Crossin的編程教室
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/42928.html
摘要:在網(wǎng)上看到好論壇類似的基本問題,以前有申請白名單的,在白名單的視頻鏈接或者騰訊旗下的視頻鏈接是原生播放,否則安卓會被劫持成騰訊家的播放器播放并且默認(rèn)全屏,目前通過白名單的方法是解決不了的。 最近公司做一個視頻活動的HTML5頁面,頁面并不復(fù)雜,但是要求視頻播放的時候不全屏。在網(wǎng)上看到好論壇類似的基本問題,以前有申請白名單的,在白名單的視頻鏈接或者騰訊旗下的視頻鏈接是原生播放,否則安卓會...
摘要:吹水今天,碼神依舊涼爽,軍體拳,摸魚一天,所以早上就在操場趴著,不過,我學(xué)會了,信不信看到抖音小姐姐的舞蹈,用代碼做出來,還挺好看,我也想試一下,不會,學(xué)莫,反正假酒已經(jīng)醒了。 ...
摘要:使用標(biāo)簽這是關(guān)于給出的基本用例。其實我們也是在這種背景下研究出來新的技術(shù)問題解決清晰度無縫切換的。這樣之前說的所有成本問題都不存在,還能做到相同體驗的無縫切換。所有代碼來自帶解析器能節(jié)省流量的西瓜播放器 前端同學(xué)要使用 HTML5 播放器視頻,必然會使用 video 標(biāo)簽,不過大多數(shù)同學(xué)只是使用了較簡單的功能,其實它本身擁有不凡之力有待我們發(fā)現(xiàn)。 首先,我們先來看下 video 最基礎(chǔ)...
閱讀 3083·2021-09-28 09:43
閱讀 918·2021-09-08 09:35
閱讀 1453·2019-08-30 15:56
閱讀 1199·2019-08-30 13:00
閱讀 2744·2019-08-29 18:35
閱讀 1840·2019-08-29 14:07
閱讀 3451·2019-08-29 13:13
閱讀 1344·2019-08-29 12:40