基於Python實現視頻轉字符畫動漫小工具
導語
哈嘍!boys and girls 我是每天瘋狂趕代碼的木木子~
今天帶大傢來點兒好玩兒的東西,我想你們肯定是喜歡的!
上面這個大傢都認識吧
對,就是字符動畫啦,之前也是不是再那個旮旯裡面看見過,但是還沒上手自己試的。
小編給大傢先試試效果瞭,效果也是真不錯,趣味性蠻強滴 推薦指數5顆星,大傢都開始動手
燥起來吧~
那麼如何將視頻動畫轉成字符畫呢?今天就來教大傢怎麼轉換,非常簡單,今天教大傢制作的
這款工具就能一鍵轉換!
正文
一、準備中
1)素材的話可以自己找一小段視頻的哈。
2)環境安裝
本文用到的環境如下:Python3、Pycharm、numpy、cv2以及部分自帶模塊。
模塊安裝:
pip install -i https://pypi.douban.com/simple/ +模塊名
二、原理簡介
1)視頻轉為一幀幀的圖片這個利用OpenCV就可以實現瞭。
2)**將每幀圖片轉為字符畫,**原理是根據圖片的像素值確定每個像素點用什麼字符。
3)按順序播放字符畫即可。
三、代碼演示
# 視頻轉字符動畫 import os import cv2 import sys import time import ctypes import subprocess import numpy as np # 暗藍色 FOREGROUND_DARKBLUE = 0x01 # 暗綠色 FOREGROUND_DARKGREEN = 0x02 # 暗天藍色 FOREGROUND_DARKSKYBLUE = 0x03 # 暗紅色 FOREGROUND_DARKRED = 0x04 # 暗粉紅色 FOREGROUND_DARKPINK = 0x05 # 暗黃色 FOREGROUND_DARKYELLOW = 0x06 # 暗白色 FOREGROUND_DARKWHITE = 0x07 # 暗灰色 FOREGROUND_DARKGRAY = 0x08 # 藍色 FOREGROUND_BLUE = 0x09 # 綠色 FOREGROUND_GREEN = 0x0a # 天藍色 FOREGROUND_SKYBLUE = 0x0b # 紅色 FOREGROUND_RED = 0x0c # 粉紅色 FOREGROUND_PINK = 0x0d # 黃色 FOREGROUND_YELLOW = 0x0e # 白色 FOREGROUND_WHITE = 0x0f # 上面顏色對應的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: 視頻轉圖片 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 ''' # 根據距離將圖片的RGB值轉為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: 圖像轉字符畫 Input: -img(np.array): 圖像 Return: -img_chars: 像素點對應的字符集合 ''' 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: 視頻轉字符畫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") # 主函數 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)截圖效果展示
第一組隨機截圖:
第二組隨機截圖:
第三組隨機截圖:
以上就是基於Python實現視頻轉字符畫動漫小工具的詳細內容,更多關於Python視頻轉字符畫的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Python 打印自己設計的字體的實例講解
- Python+OpenCV讀寫視頻的方法詳解
- C/C++ 中怎樣使用SetConsoleTextAttribute()函數來控制輸出字符的顏色
- Python OpenCV讀取視頻報錯的問題解決
- opencv 分類白天與夜景視頻的方法