基于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视频转字符画的资料请关注我们其它相关文章!

(0)

相关推荐

  • 通过python绘制华强买瓜的字符画视频的步骤详解

    已经11月了,不知道还有没有人看华强买瓜...要把华强卖瓜做成字符视频,总共分为三步 读取视频 把每一帧转为字符画 把字符画表现出来 读取视频 通过imageio读取视频,除了pip install imageio之外,还需要pip install imageio-ffmpeg. 由于视频中的图像都是彩色的,故而需要将rgb三色转为单一的强度,并将转化后的图像装入一个列表中. import imageio import numpy as np import matplotlib.pyplot a

  • Python实现视频转换为字符画详解

    上次写了个华强买瓜字符视频的帖子,下面有人问如何保存,所以这次就写一个能将字符画视频保存下来的帖子,然而时不待我,华强纪元已经结束,现在是穿山甲的时代了. 首先读取视频,并转为字符.视频是从B站下载的,地址<激战江南>穿山甲名场面. 由于B站直接下载的视频为flv格式,而imageio并不支持,尽管可以用opencv来读取,但相比之下,用ffmepg转个码也不复杂,这样可以最大限度地利用华强买瓜的代码. 另外,视频素材过长不适合代码演示,所以从第2:10进行截取15s. 在命令行中输入 >

  • python绘制字符画视频的示例代码

    目录 读取视频 转为字符 动画 已经11月了,不知道还有没有人看华强买瓜...要把华强卖瓜做成字符视频,总共分为三步 读取视频 把每一帧转为字符画 把字符画表现出来 读取视频 通过imageio读取视频,除了pip install imageio之外,还需要pip install imageio-ffmpeg. 由于视频中的图像都是彩色的,故而需要将rgb三色转为单一的强度,并将转化后的图像装入一个列表中. import imageio import numpy as np import mat

  • 基于Python实现视频转字符画动漫小工具

    目录 导语 正文 一.准备中 二.原理简介 三.代码演示 四.效果展示 导语 ​哈喽!boys and  girls 我是每天疯狂赶代码的木木子~ 今天带大家来点儿好玩儿的东西,我想你们肯定是喜欢的! 上面这个大家都认识吧 对,就是字符动画啦,之前也是不是再那个旮旯里面看见过,但是还没上手自己试的. 小编给大家先试试效果了,效果也是真不错,趣味性蛮强滴 推荐指数5颗星,大家都开始动手 燥起来吧~ 那么如何将视频动画转成字符画呢?今天就来教大家怎么转换,非常简单,今天教大家制作的 这款工具就能一键

  • 基于python实现图片转字符画代码实例

    直接上代码图片就使用我家爽妹子的吧 如果没有安装pil模块的话先cmd安装下 输入:pip install pillow # -*- coding: utf-8 -*- from PIL import Image codeLib = '''@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,"^`'. '''#生成字符画所需的字符集 count = len(codeLib) def transform1

  • Python 实现图片转字符画的示例(静态图片,gif皆可)

    字符画是一种由字母.标点或其他字符组成的图画,它产生于互联网时代,在聊天软件中使用较多,本文我们看一下如何将自己喜欢的图片转成字符画. 静态图片 首先,我们来演示将静态图片转为字符画,功能实现主要用到的 Python 库为 OpenCV,安装使用 pip install opencv-python 命令即可. 功能实现的基本思路为:利用聚类将像素信息聚为 3 或 5 类,颜色最深的一类用数字密集度表示,阴影的一类用横杠(-)表示,明亮部分用空白表示. 主要代码实现如下: def img2stri

  • Python将图片转换为字符画的方法

    最近在学习Python,看到网上用Python将图片转换成字符画便来学习一下 题目意思是,程序读入一个图片,以txt格式输出图片对应的字符画,如图所示: 以下是Python代码: # coding:utf-8 # 为一张图片生成对应的字符集图片 from PIL import Image import argparse # 命令行输入参数处理 parser = argparse.ArgumentParser() parser.add_argument('file') # 输入文件 parser.

  • 基于Python实现视频的人脸融合功能

    ​ 图片提取 为了方便技术展示,我们选取素材为演员杨紫的一段演讲视频,用例仅为技术交流演示使用,不针对任何指定人. 为达到我们AI换脸的目的,我们首先需要将这段视频逐帧提取成照片 def vedio_2_pic(self,file,save_path): """ 逐帧取照片 file:视频的位置 save_path:保存路径 """ # 读取视频 video = cv2.VideoCapture(file) # 获取视频帧率 fps = vide

  • python实现图片转字符画

    本文实例为大家分享了python实现图片转字符画的具体代码,供大家参考,具体内容如下 源码(注释很详细): # -*- coding=utf-8 -*- ################################### #1:import argparse #2:parser = argparse.ArgumentParser() #3:parser.add_argument() #4:parser.parse_args() #解释:首先导入该模块:然后创建一个解析对象:然后向该对象中添加

  • python实现图片转字符画的完整代码

    前言 最初是在实验楼看到的一个小实验 实验楼-Python 图片转字符画 原文是需要通过命令行运行程序 这里改为直接运行,需要固定一些参数 运行平台: Windows Python版本: Python3.6 IDE: Sublime Text 1.实验准备 pillow库的安装 pip install pillow 2.实验原理 字符画是一系列字符的组合,我们可以把字符看作是比较大块的像素,一个字符能表现一种颜色,字符的种类越多,可以表现的颜色也越多,图片也会更有层次感. 最终显示的是黑白色的字

  • 基于Python实现视频分辨率转换

    目录 前言 环境依赖 代码 验证一下 前言 本文提供将视频调整分辨率的Python代码,一如既往的实用主义. 环境依赖 ffmpeg环境安装,可以参考文章:windows ffmpeg安装部署 ffmpy安装: pip install ffmpy -i https://pypi.douban.com/simple 代码 不废话上代码. #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/12/12 14:07 # @Autho

  • 利用Python 实现图片转字符画

    目录 前言 字符画的原理 灰度值和RGB 代码实战 总结 前言 相信大家在网上经常看到有人秀出各种各样的字符画,对于这个五彩斑斓的世界来说,我们日常看到的都是一些高清的彩色的图片,偶尔来个粗糙的黑白的字符画,还是比较解乏的.喜欢记得收藏.关注.点赞. 字符画的原理 这种字符画的原理也比较简单,我们可以把每个字符看成是一个大的像素,一个字符可以代表一种颜色,字符各类越多,可体现的颜色越多,字符画就更有层次感. 灰度值和RGB 灰度值是指黑白图像中点的颜色的深度,它的范围是0-255,白色为255,

随机推荐