本次项目操作过程是先把视频切成一张张图片,再 把图片处理成字符串图片,再将其拼接成视频。
处理前后图片对比:
第一步,安装好所需的库
本次项目所需的第三方库主要有两个,opencv库和pillow库
pip install 库名
但是导入时需要注意,
import cv2 #导入opencv库
from PIL import ... #导入pillow库
第二步 实现功能
- 把视频切割成一张张图片
import cv2
vid = cv2.VideoCapture('图片路径\1.mp4')
print(vid)
# vid是一个VideoCapture对象,可以用read()方法读取
print(vid.read())
# 读取结果为
'''
(True, array([[[250, 250, 250],
[250, 250, 250],
[250, 250, 250],
...,
[226, 225, 212],
[226, 225, 212],
[226, 225, 212]]], dtype=uint8))
'''
中间那个二维矩阵即为视频中每一张图片的的rgb编码,
所以,只需取出二维矩阵,即可把 每张图片切割开。
success = True
count = 0
while success:
success, image = vid.read() # success为上边读取出来的元组中的第一个元素True,image为视频矩阵
cv2.imwrite("img/%d.jpg" % count,image) # 引号内为存储路径和文件名,这里用了相对路径
count+=1
- 将每张图片转化成字符串
import cv2
from PIL import Image,ImageDraw,ImageFont
import os
def draw(pic):
img = cv2.imread('img/'+pic)
# print(img)
img = img[:, :, (2, 1, 0)] # 因为 矩阵中的RGB和opencv中的正好相反,所以用该操作转换矩阵顺序
# 创建一个画布
blank = Image.new("RGB", [len(img[0]), len(img)], color="white")
draeobj = ImageDraw.Draw(blank)
n = 10
font = ImageFont.truetype('C:\Windows\Fonts\simfang.ttf',size=n-1)# 这里需要一个自己电脑内的字体文件
for i in range(0,len(img),n):
for j in range(0,len(img[i]),n):
text = '水原千鹤天下第一 ' # 这里随便定义一个字符串,当然可以自己随机生成
draeobj.ink = img[i][j][0] + img[i][j][1]*256 + img[i][j][2]*256*256
draeobj.text([j,i],text[int(j/n)%len(text)],font=font)
blank.save('new_img/'+pic,'jpeg') # 字符串图片存储路径
filelist = os.listdir('img') # 正常图片读取路径
for file in filelist:
draw(file)
注:这步操作很耗费时间
- 拼接视频
import os
import cv2
def resort(list):
new_list = []
for i in list:
new_list.append(int(i.split('.')[0]))
new_list = sorted(new_list) # 该操作是要给图片排序,有时可能不需要排序
return new_list
def picvideo(path,size):
filelist = os.listdir(path)
filelist = resort(filelist)
filepath = 'new_video/op.avi' # 视频输出路径,需带上文件名和文件后缀
fourcc = cv2.VideoWriter_fourcc('I','4','2','0') # 这是opencv中的foucc编码格式
fps = 24
video = cv2.VideoWriter(filepath,fourcc,fps,size)
for item in filelist:
item = os.path.join(path,str(item)+'.jpg')
img = cv2.imread(item)
video.write(img)
video.release()
picvideo('new_img',(1920,1080)) # 第一个参数为字符串图片路径,第二个是分辨率
更多的编码格式:https://blog.csdn.net/u013943420/article/details/78779197