import os
import sys
import pickle
import numpy as N
import invoke
from threading import Thread
pixels = " .,`'-~:!1+*abcdefghijklmnopqrstuvwxyz<>()\/{}[]?234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ%&@#$"
def Video_to_imgs(Video, size, seconds):
"""
param1: 视频文件路径,str
param2: 生成图片的尺寸,[H,L]
return: img_list
"""
import cv2
img_list = []
picture = cv2.VideoCapture(Video)
fps = picture.get(cv2.CAP_PROP_FPS)
frames_count = fps * seconds
count = 0
while picture.isOpened() and count < frames_count:
ret,frame = picture.read()
"""
read()
return: [是否读取到图像, 图像矩阵]
"""
if ret:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 转黑白图
img = cv2.resize(gray, size, interpolation = cv2.INTER_AREA) #调整图片,保证图片可读取且打印
img_list.append(img) # 保存结果
count += 1
else:
break
picture.release() # 释放空间
return img_list, fps, int(frames_count)
""" 测试 Video_to_imgs
if __name__ == "__main__":
imgs = Video_to_imgs("BadApple.mp4", (64, 48))
assert len(imgs) > 10
"""
def img_to_chars(img, i):
res = []
height, width = img.shape
"""
param: 图像矩阵
return: 字符串列表
"""
for row in range(height):
line = ""
for col in range(width):
percent = img[row][col] / 255 # 将8位灰度值转换为0-1之间
index = int(percent * (len(pixels) - 1)) #进一步转换灰度值以匹配字符列表 pixels
line += pixels[index] + " " # 增加字符间距
res.append(line)
res.append("")
i=str(round(i*100,2))+"% "+"■"*int(i*width*2) #打印输出进度条
res.append(i)
return res
def imgs_to_chars(imgs, frames_count):
video_chars, i = [], 0
for img in imgs:
i += 1
video_chars.append(img_to_chars(img, i/frames_count))
return video_chars
""" 测试 imgs_to_chars
if __name__ == "__main__":
imgs = Video_to_imgs("BadApple.mp4", (64, 48))
video_chars = imgs_to_chars(imgs)
assert len(video_chars) > 10
"""
def play_video(video_chars, frame_rate, frames_count):
import time
import curses
width,height = len(video_chars[0][0]), len(video_chars[0]) # 获取文件尺寸
stdscr = curses.initscr()
curses.start_color()
try:
stdscr.resize(height, width * 2)
for pic_i in range(len(video_chars)):
for line_i in range(height): #打印当前帧
stdscr.addstr(line_i, 0, video_chars[pic_i][line_i], curses.COLOR_WHITE) # 打印显示,并将字符调整为白色
stdscr.refresh()
time.sleep(1 / frame_rate)
finally:
curses.endwin()
print("播放完毕")
return
def dump(obj, file_name):
with open(file_name, 'wb') as f:
pickle.dump(obj, f)
return
def load(filename):
with open(filename,'rb') as f:
return pickle.load(f)
def get_file_name(file_path):
path, file_name_with_extension = os.path.split(file_path)
file_name, file_extension = os.path.splitext(file_name_with_extension)
return file_name
def has_file(path, file_name):
return file_name in os.listdir(path)
def get_video_chars(video_path, size, seconds):
video_dump = get_file_name(video_path) + ".pickle"
if has_file(".", video_dump):
print("正在读取")
video_chars, fps, frames_count = load(video_dump)
else:
print("正在加载,请稍等")
imgs, fps, frames_count = Video_to_imgs(video_path, size, seconds)
video_chars = imgs_to_chars(imgs, frames_count)
dump([video_chars, fps, frames_count], video_dump)
print("加载完成")
return video_chars, fps, frames_count
def play_audio(video_path):
def call(video_path = video_path):
filename = sys.argv[0]
dirname = os.path.dirname(filename)
abspath = os.path.abspath(dirname)
cmd = "mpv --no-video " + abspath + "\\" + video_path
invoke.run(cmd, hide=True, warn=True)
return Thread(target=call)
def main(video_path):
size = (80,45) # 输出分辨率 建议是100*100以内,和原视频宽高比相同
# video_path = "BadApple.mp4"
seconds = 30 #视频播放时长
video_chars, fps, frames_count = get_video_chars(video_path, size, seconds)
input("开始播放")
p = play_audio(video_path)
p.setDaemon(True)
p.start()
play_video(video_chars, fps, frames_count)
if __name__ == "__main__":
try:
video_path = sys.argv[1]
except:
video_path = ""
if video_path == "":
video_path = input("输入视频地址:")
main(video_path)
exit()
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
1.项目通过 OpenCV 轻量、高效的 C++类以及 Python 语言的接口,将视频逐帧转换成 字符画,实现对图片按照原格式封装,完成视频字符化的应用。 2.项目运行环境:需要 Python 3.6 及以上配置。在 OpenCV 官方网站https://opencv.org/下载最新且完整的源码以及大部分 release 版本源码,链接https://opencv.org/releases.htm。 3.项目包括4个模块:视频读取及处理、色素块识别与替换、视频合成、操作系统上的实现。其中,色素块识别与替换主要由公式计算、色素块提取及 ASCII 码替换组成;视频合成主要完成视频读取、处理、色素块识别与替换,将处理完成的图片进行逐帧拼接;得到 ASCII 码字符集后通过 OpenCV 自带图片视频转化工具实现视频的生成。操作系统上的实现部分包括确定文件地址与格式要求。
资源推荐
资源详情
资源评论


























收起资源包目录




共 2 条
- 1

小胡说人工智能
- 粉丝: 6404
- 资源: 41
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制

- 1
- 2
前往页