只需要在最后一行括号填入视频路径即可
import os
from PIL import Image, ImageDraw, ImageFont
import cv2
import time
from tqdm import tqdm
import threading
if __name__ == '__main__':
def cv2_pit_imgchar(path,save_path=''):
def create_img(text,show='no',save_path=save_path):
s = time.time()
img = Image.new('RGB', (1260, 915), color = (255, 255, 255))
draw = ImageDraw.Draw(img)
font = ImageFont.truetype('SIMLI.TTF', 10)
draw.text((1,0),text, font=font, fill=(0, 0, 0))
e = time.time()
if show=='yes':
img.show()
if not save_path=='':
img.save(save_path)
return img
ASCII_CHARS = ['.',',',':',';','+','*','?','T','P','%','@']
ASCII_CHARS = ASCII_CHARS[::-1]
img1 = cv2.imread(path,cv2.IMREAD_GRAYSCALE)
def cv2_img_resize(img1,w_size):
h,w = img1.shape[0:2]
re_rate=h/w
img1=cv2.resize(img1,(w_size,int(w_size*re_rate/2)))
return img1
img1 = cv2_img_resize(img1,250)
def img_to_char(img1):
img_text = ''
s1 = time.time()
for y in img1:
for x in y:
new_pixels = [ASCII_CHARS[x//25]]
new_pixels= ''.join(new_pixels)
img_text+=str(new_pixels)
img_text+='\n'
e1 = time.time()
return img_text
img_text = img_to_char(img1)
create_img(img_text)
def get_folder_imgs(folder):
x=0
path_list = []
for img_name in os.listdir(folder):
if '.jpg' in img_name:
path_list.append(folder+img_name)
x+=1
print(f'总共{x}张图片')
return path_list
def video_to_imgs(video_path = r"D:\1111\sportballcn.mp4",save_path='img/sportball/',th=4):
video = cv2.VideoCapture(video_path)
fps = int(video.get(cv2.CAP_PROP_FPS))
if not os.path.exists(save_path):
print('创建保存路径')
os.makedirs(save_path)
def run(t,th):
video = cv2.VideoCapture(video_path)
frames = video.get(cv2.CAP_PROP_FRAME_COUNT)
print(f'第{t+1}个线程启动,处理{int(frames*t/th)}到{int(frames*(t+1)/th)}帧')
t1 = time.time()
for x in tqdm(range(int(frames))):
retval,image = video.read()
if not retval:
break
if frames*t/th<=x<=frames*(t+1)/th:
cv2.imwrite(f'{save_path}{x}.jpg',image)
t2 = time.time()
print(f"线程{t+1},耗时{round(t2-t1,2)}s")
tt = dict()
for t in range(th):
tt[t]=threading.Thread(target=run,args=(t,th))
for t in range(th):
tt[t].start()
for t in range(th):
tt[t].join()
return fps
def batch_img_to_charimg(folder='img/sportball/',save_path='img/spaortchar/',th=1):
path_list = get_folder_imgs(folder)
if not os.path.exists(save_path):
print(f'创建字符图保存路径{save_path}')
os.makedirs(save_path)
print('正在将图片转换为字符图')
img_counting = len(path_list)
def run(t,th):
t1=time.time()
print(f'第{t+1}个线程启动,处理{int(img_counting*t/th)}到{int(img_counting*(t+1)/th)}张图')
x=0
for path in tqdm(path_list):
name = path.split('/')[-1]
if img_counting*t/th<=x<=img_counting*(t+1)/th:
cv2_pit_imgchar(path=path,save_path=f'{save_path}{name}')
x+=1
t2 = time.time()
print(f"线程{t+1},耗时{round(t2-t1,2)}s")
tt=dict()
for t in range(th):
tt[t]=threading.Thread(target=run,args=(t,th))
for t in range(th):
tt[t].start()
for t in range(th):
tt[t].join()
def char_imgs_to_video(char_img_folder = "img/spaortchar",save_name='streetchar.mp4',fps=30):
fps=fps
size = (1260, 915)
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
char_video = cv2.VideoWriter(save_name, fourcc, fps, size, isColor=True)
img_names = os.listdir(char_img_folder)
img_names.sort(key=lambda x:int(x[:-4]))
print('将字符图合并成视频中...')
for img_name in tqdm(img_names):
if '.jpg' in img_name:
img = cv2.imread(char_img_folder+'/'+img_name)
char_video.write(img)
char_video.release()
print('完成')
def batch_img_to_charimg1(folder='img/aq/',save_path='img/aqchar/'):
path_list = get_folder_imgs(folder)
if not os.path.exists(save_path):
print(f'创建字符图保存路径{save_path}')
os.makedirs(save_path)
print('正在将图片转换为字符图')
for path in tqdm(path_list):
name = path.split('/')[-1]
cv2_pit_imgchar(path=path,save_path=f'{save_path}{name}')
def v2cv(video_path = r"D:\1111\aq.mp4"):
s_p1 = 'img/img/'
s_p2 = 'img/charimg/'
fps=30
fps=video_to_imgs(video_path=video_path,save_path=s_p1,th=4)
batch_img_to_charimg(folder=s_p1,save_path=s_p2,th=1)
char_imgs_to_video(char_img_folder = s_p2,save_name='char.mp4',fps=fps)
v2cv('d:/1111/sd.mp4')