0%

如何利用python将视频转成字符画视频

​ 博主最近做了个跟科研无关的东西-视频转字符画视频,额,略显无聊哈。咱直接切入正题,这玩意到底咋实现呢?不急听我娓娓道来。其实很简单,将视频分解成一帧帧图片,再将图片转成字符图片,再将字符图片合成视频。对的,就是这样,下面放上博主写的源代码。这里多嘴一句哈,我觉得学习编程,理清思路是非常重要的,我的思路都反映在源码上了,这也是每次说一下思路就直接上菜的原因,我个人水平有限,相信大家都能看懂。啧啧啧,又开始话痨了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import cv2
import numpy as np
import os
import threading
import re
from PIL import Image, ImageDraw, ImageFont
import time


class video_chr_figure():

def __init__(self, video_adr):
self.txt = ''
self.video_adr = video_adr
self.pix_weight = 0
self.pix_height = 0
print('即将载入的视频是%s' % re.search(r'(.*)\..*', video_adr).group(1))
self.ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
self.chr_l = len(self.ascii_char)

# 将视频转化为图片
def video_fig(self):
cap = cv2.VideoCapture(self.video_adr)
i = 0
try:
while cap.isOpened():
ret, frame = cap.read()
fig_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
if not ret:
print('视频读取错误,请检查视频格式')
break
self.pix_weight = int(np.size(np.array(fig_gray), 1) / 6)
self.pix_height = int(np.size(np.array(fig_gray), 0) / 6)
img = Image.fromarray(fig_gray)
img.save('C:/Users/yplit/Documents/python projects/ceshi/' + 'img_' + str(i) + '.jpg')
i += 1
except:
return i

# 将图片转化为字符画
def fig_ch(self, num):

img = cv2.imread('C:/Users/yplit/Documents/python projects/ceshi/' + 'img_' + str(num) + '.jpg', 0)
im_g = cv2.resize(img, (self.pix_weight, self.pix_height), interpolation = cv2.INTER_AREA)
print(self.pix_height, self.pix_weight)
for k in range(self.pix_height):
for j in range(self.pix_weight):
pix_ch = self.ascii_char[int(im_g[k][j] / 256 * self.chr_l)]

self.txt += pix_ch
self.txt += '\r\n'
# print(self.txt)
im = Image.new('L', (self.pix_weight *3, self.pix_height*9), 255)
dr = ImageDraw.Draw(im)
font = ImageFont.truetype(os.path.join("fonts", "simsun.ttc"), 5)
dr.text((0, 0), self.txt, font=font, fill="#000000")
img = im.resize((self.pix_weight *6, self.pix_height*6))
img.save('C:/Users/yplit/Documents/python projects/ceshi/' + 'img_' + str(num) + '.jpg')
del dr
im.close()

# 将字符画转变为视频
def fig_vid(self, i):

fps = 25
size = (self.pix_weight * 6, self.pix_height * 6)
videowriter = cv2.VideoWriter('C:/Users/yplit/Documents/python projects/ceshi/2/ceshi.avi',
cv2.VideoWriter_fourcc('M', 'J', 'P','G'), fps, size)

for k in range(i):
frame = cv2.imread('C:/Users/yplit/Documents/python projects/ceshi/2/' + 'img_' + str(k) + '.jpg')
videowriter.write(frame)
videowriter.release()


if __name__ == '__main__':
vcf = video_chr_figure('C:/Users/yplit/Documents/WeChat Files/wxid_vh6shev3b8lj22/FileStorage/Video/2020-08/ceshi.mp4')
i = vcf.video_fig()
a = []
for num in range(207, i):
t = threading.Thread(target=vcf.fig_ch, args=(num,))
t.start()
a.append(t)
time.sleep(1)
for t in a:
t.join()
vcf.fig_vid(i)

代码还可进一步优化,如果视频大并且电脑配置低的建议优化一下代码再运行,效果图如下。

-------------本文结束感谢您的阅读-------------
您的支持将鼓励我继续创作!