基于Python實(shí)現(xiàn)視頻轉(zhuǎn)字符畫動(dòng)漫小工具
導(dǎo)語(yǔ)
?哈嘍!boys and? girls 我是每天瘋狂趕代碼的木木子~
今天帶大家來點(diǎn)兒好玩兒的東西,我想你們肯定是喜歡的!

上面這個(gè)大家都認(rèn)識(shí)吧
對(duì),就是字符動(dòng)畫啦,之前也是不是再那個(gè)旮旯里面看見過,但是還沒上手自己試的。
小編給大家先試試效果了,效果也是真不錯(cuò),趣味性蠻強(qiáng)滴 推薦指數(shù)5顆星,大家都開始動(dòng)手
燥起來吧~
那么如何將視頻動(dòng)畫轉(zhuǎn)成字符畫呢?今天就來教大家怎么轉(zhuǎn)換,非常簡(jiǎn)單,今天教大家制作的
這款工具就能一鍵轉(zhuǎn)換!

正文
一、準(zhǔn)備中
1)素材的話可以自己找一小段視頻的哈。
2)環(huán)境安裝
本文用到的環(huán)境如下:Python3、Pycharm、numpy、cv2以及部分自帶模塊。
模塊安裝:
pip install -i https://pypi.douban.com/simple/ +模塊名
二、原理簡(jiǎn)介
1)視頻轉(zhuǎn)為一幀幀的圖片這個(gè)利用OpenCV就可以實(shí)現(xiàn)了。
2)**將每幀圖片轉(zhuǎn)為字符畫,**原理是根據(jù)圖片的像素值確定每個(gè)像素點(diǎn)用什么字符。
3)按順序播放字符畫即可。
三、代碼演示
# 視頻轉(zhuǎn)字符動(dòng)畫
import os
import cv2
import sys
import time
import ctypes
import subprocess
import numpy as np
# 暗藍(lán)色
FOREGROUND_DARKBLUE = 0x01
# 暗綠色
FOREGROUND_DARKGREEN = 0x02
# 暗天藍(lán)色
FOREGROUND_DARKSKYBLUE = 0x03
# 暗紅色
FOREGROUND_DARKRED = 0x04
# 暗粉紅色
FOREGROUND_DARKPINK = 0x05
# 暗黃色
FOREGROUND_DARKYELLOW = 0x06
# 暗白色
FOREGROUND_DARKWHITE = 0x07
# 暗灰色
FOREGROUND_DARKGRAY = 0x08
# 藍(lán)色
FOREGROUND_BLUE = 0x09
# 綠色
FOREGROUND_GREEN = 0x0a
# 天藍(lán)色
FOREGROUND_SKYBLUE = 0x0b
# 紅色
FOREGROUND_RED = 0x0c
# 粉紅色
FOREGROUND_PINK = 0x0d
# 黃色
FOREGROUND_YELLOW = 0x0e
# 白色
FOREGROUND_WHITE = 0x0f
# 上面顏色對(duì)應(yīng)的RGB值
cmd_colors = {
'FOREGROUND_DARKBLUE': [FOREGROUND_DARKBLUE, (0, 0, 139)],
'FOREGROUND_DARKGREEN': [FOREGROUND_DARKGREEN, (0, 100, 0)],
'FOREGROUND_DARKSKYBLUE': [FOREGROUND_DARKSKYBLUE, (2, 142, 185)],
'FOREGROUND_DARKRED': [FOREGROUND_DARKRED, (139, 0, 0)],
'FOREGROUND_DARKPINK': [FOREGROUND_DARKPINK, (231, 84, 128)],
'FOREGROUND_DARKYELLOW': [FOREGROUND_DARKYELLOW, (204, 204, 0)],
'FOREGROUND_DARKWHITE': [FOREGROUND_DARKWHITE, (255, 250, 250)],
'FOREGROUND_DARKGRAY': [FOREGROUND_DARKGRAY, (169, 169, 169)],
'FOREGROUND_BLUE': [FOREGROUND_BLUE, (0, 0, 255)],
'FOREGROUND_GREEN': [FOREGROUND_GREEN, (0, 128, 0)],
'FOREGROUND_SKYBLUE': [FOREGROUND_SKYBLUE, (135, 206, 235)],
'FOREGROUND_RED': [FOREGROUND_RED, (255, 0, 0)],
'FOREGROUND_PINK': [FOREGROUND_PINK, (255, 192, 203)],
'FOREGROUND_YELLOW': [FOREGROUND_YELLOW, (255, 255, 0)],
'FOREGROUND_WHITE': [FOREGROUND_WHITE, (255, 255, 255)]
}
CHARS = " .,-'`:!1+*abcdefghijklmnopqrstuvwxyz<>()\/{}[]?234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ%&@#$"
'''
Function:
視頻轉(zhuǎn)圖片
Input:
-videopath: 視頻路徑
-size: 指定圖片大小
-interval: 視頻每interval幀取一幀
Return:
-img_list: 圖像列表
'''
def video2imgs(videopath, size, interval=1):
img_list = list()
capture = cv2.VideoCapture(videopath)
i = -1
while capture.isOpened():
i += 1
ret, frame = capture.read()
if ret:
if i % interval == 0:
# frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
img = cv2.resize(frame, size, interpolation=cv2.INTER_AREA)
img_list.append(img)
else:
break
capture.release()
return img_list
'''
# 根據(jù)距離將圖片的RGB值轉(zhuǎn)為Windows-CMD窗口支持的顏色
def RGB2Cmdcolor(color):
cmd_color = None
min_distance = 1e6
for key, value in cmd_colors.items():
distance = np.square(np.array(color) - np.array(value[1])).sum()
if distance < min_distance:
min_distance = distance
cmd_color = value[0]
return cmd_color
'''
'''
Function:
圖像轉(zhuǎn)字符畫
Input:
-img(np.array): 圖像
Return:
-img_chars: 像素點(diǎn)對(duì)應(yīng)的字符集合
'''
def img2chars(img):
img_chars = []
height, width, channel = img.shape
for row in range(height):
line = ""
for col in range(width):
percent = int(np.array(img[row][col]).sum() / 3) / 255
char_idx = int(percent * (len(CHARS) - 1))
line += CHARS[char_idx] + ' '
img_chars.append(line)
return img_chars
'''
Function:
視頻轉(zhuǎn)字符畫s
Input:
-imgs: 視頻里捕獲的所有圖片
Return:
-video_chars: img_chars的集合
'''
def imgs2chars(imgs):
video_chars = []
for img in imgs:
video_chars.append(img2chars(img))
return video_chars
'''
Function:
播放字符畫s
Input:
-video_chars: imgs2chars中獲取的video_chars
-iscmd(bool): 是否在Windows的cmd窗口播放
-color: 顏色選擇, cmd中有效
'''
def play(video_chars, color=None, iscmd=True):
if color and iscmd:
STD_OUTPUT_HANDLE = -11
std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
color_choice = None
if color.isdigit():
color_choice = list(cmd_colors.values())[int(color)][0]
else:
color_choice = cmd_colors.get(color)[0]
if color_choice is not None:
_ = ctypes.windll.kernel32.SetConsoleTextAttribute(std_out_handle, color_choice)
width, height = len(video_chars[0][0]), len(video_chars[0])
for img_chars in video_chars:
for row in range(height):
print(img_chars[row])
time.sleep(1/24)
if iscmd:
os.system('cls')
else:
subprocess.call("clear")
# 主函數(shù)
def main(videopath, color=None, iscmd=True):
imgs = video2imgs(videopath=videopath, size=(64, 48), interval=1)
video_chars = imgs2chars(imgs)
input("[INFO]: Complete Pre-processing! Enter <enter> button to start to play...")
if iscmd:
os.system('cls')
else:
subprocess.call("clear")
play(video_chars, color=color, iscmd=True)
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-f', '--file', help='Video file.')
parser.add_argument('-c', '--color', help='Color for playing.')
args = parser.parse_args()
main(args.file, color=args.color)
四、效果展示
1)截圖效果展示
第一組隨機(jī)截圖:


?第二組隨機(jī)截圖:


第三組隨機(jī)截圖:

以上就是基于Python實(shí)現(xiàn)視頻轉(zhuǎn)字符畫動(dòng)漫小工具的詳細(xì)內(nèi)容,更多關(guān)于Python視頻轉(zhuǎn)字符畫的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
gearman的安裝啟動(dòng)及python API使用實(shí)例
這篇文章主要介紹了gearman的安裝啟動(dòng)及python API使用,需要的朋友可以參考下2014-07-07
django-利用session機(jī)制實(shí)現(xiàn)唯一登錄的例子
這篇文章主要介紹了django-利用session機(jī)制實(shí)現(xiàn)唯一登錄的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03
python雙端隊(duì)列原理、實(shí)現(xiàn)與使用方法分析
這篇文章主要介紹了python雙端隊(duì)列原理、實(shí)現(xiàn)與使用方法,結(jié)合實(shí)例形式分析了Python雙端隊(duì)列的概念、原理、定義及使用方法,需要的朋友可以參考下2019-11-11
7個(gè)流行的Python強(qiáng)化學(xué)習(xí)算法及代碼實(shí)現(xiàn)詳解
目前流行的強(qiáng)化學(xué)習(xí)算法包括?Q-learning、SARSA、DDPG、A2C、PPO、DQN?和?TRPO。這些算法已被用于在游戲、機(jī)器人和決策制定等各種應(yīng)用中,本文我們將對(duì)其做一個(gè)簡(jiǎn)單的介紹,感興趣的可以學(xué)習(xí)一下2023-01-01
python中的iterator和"lazy?iterator"區(qū)別介紹
這篇文章主要介紹了python中的iterator和?“l(fā)azy?iterator“之間有什么區(qū)別,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
OpenCV實(shí)現(xiàn)圖片編解碼實(shí)踐
在很多應(yīng)用中,經(jīng)常會(huì)直接把圖片的二進(jìn)制數(shù)據(jù)進(jìn)行交換,這就需要對(duì)普通進(jìn)行編碼解碼,那么怎么才能實(shí)現(xiàn),本文就來介紹一下2021-06-06
Python實(shí)現(xiàn)Event回調(diào)機(jī)制的方法
今天小編就為大家分享一篇Python實(shí)現(xiàn)Event回調(diào)機(jī)制的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-02-02

