基于Python如何实现视频转字符画动漫小工具
发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,本篇文章给大家分享的是有关基于Python如何实现视频转字符画动漫小工具,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。导语今天带大家来点
千家信息网最后更新 2025年01月18日基于Python如何实现视频转字符画动漫小工具
本篇文章给大家分享的是有关基于Python如何实现视频转字符画动漫小工具,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
导语
今天带大家来点儿好玩儿的东西,我想你们肯定是喜欢的!
上面这个大家都认识吧
对,就是字符动画啦,之前也是不是再那个旮旯里面看见过,但是还没上手自己试的。
小编给大家先试试效果了,那么如何将视频动画转成字符画呢?今天就来教大家怎么转换,非常简单,今天教大家制作的
这款工具就能一键转换!
正文
一、准备中
1)素材的话可以自己找一小段视频的哈。
2)环境安装
本文用到的环境如下:Python3、Pycharm、numpy、cv2以及部分自带模块。
模块安装:
pip install -i https://pypi.douban.com/simple/ +模块名
二、原理简介
1)视频转为一帧帧的图片这个利用OpenCV就可以实现了。
2)**将每帧图片转为字符画,**原理是根据图片的像素值确定每个像素点用什么字符。
3)按顺序播放字符画即可。
三、代码演示
# 视频转字符动画import osimport cv2import sysimport timeimport ctypesimport subprocessimport 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: 视频转字符画sInput: -imgs: 视频里捕获的所有图片Return: -video_chars: img_chars的集合'''def imgs2chars(imgs): video_chars = [] for img in imgs: video_chars.append(img2chars(img)) return video_chars'''Function: 播放字符画sInput: -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! Enterbutton 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如何实现视频转字符画动漫小工具,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。
字符
视频
图片
工具
像素
动画
图像
效果
模块
颜色
动漫
原理
天蓝色
就是
截图
更多
环境
白色
知识
篇文章
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
湖南板材套料软件开发商
vpn服务器在哪里买
松江区市场软件开发包括什么
华硕软件开发工资
网络安全基线配置标准
星际争霸怎么做服务器
欧盟网络安全产业
无线网络技术的工作原理
数据库都是有状态的
临沂哪里有学网络技术的培训机构
男主网络安全小说
勇仕网络安全中心
软件开发日文自我介绍
网络安全检察一般会问什么问题
干软件开发干不下去了
软件开发需求分解表
数据库01445
天津网络安全竞赛报名
张雪峰讲网络安全
标准服务器操作系统
软件开发服务合同
ftp服务器的安全性
网络安全重要会议
客户服务器风格的体系结构
腾根网络技术有限公司
历史表数据库名称
三级网络技术考试过程
微颖网络技术有限公司
贵阳服务器租用南沙人才
网络安全版面