需求:将视频中的某一片段,加上另外一张图片,且每张图片在视频中的位置是固定的,不要求变化。
1.视频分帧
'''
利用opencv将视频按帧分割,并以png得格式存储,不改变分辨率
'''
import cv2
import os
path = 'video'
video_list = os.listdir(path)
for video in video_list:
video_path = os.path.join(os.getcwd(),path,video)
vc=cv2.VideoCapture(video_path)
if vc.isOpened():
rval,frame=vc.read()
else:
rval=False
c =1
while rval:
rval,frame=vc.read()
if rval==False:
break
cv2.imwrite('D:/630/0706/'+str(c)+'.png',frame)
print(c)
c=c+1
cv2.waitKey(1)
vc.release()
2。copy
import os
from PIL import Image
dirpath=r"D:/630/0706"#大图文件夹
goatpath=r"D:/630/21"
if not os.path.exists(goatpath):
os.mkdir(goatpath)
# Opening the primary image (used in background)
img1 = Image.open("zi.png")#小图路径
img1 = img1.convert("RGBA")
i = 1
for curDir,dirs,files in os.walk(dirpath):
for file in files:
img2 = Image.open(curDir+"\\"+file)
img2 = img2.convert("RGBA")
# img2.paste(img1, (325,160), mask=img1)
img2.paste(img1, (519,284), mask=img1) # 子图在母图上的坐标
img2.save(goatpath+"\\"+str(i)+".png")
print(goatpath + "\\" + str(i) + ".png" + " has done")
i=i+1
3.合成视频
import os
import cv2
# 要被合成的多张图片所在文件夹
# 路径分隔符最好使用“/”,而不是“\”,“\”本身有转义的意思;或者“\\”也可以。
# 因为是文件夹,所以最后还要有一个“/”
file_dir = 'D:/630/21/'
list = []
for root ,dirs, files in os.walk(file_dir):
for file in files:
list.append(file) # 获取目录下文件名列表
# VideoWriter是cv2库提供的视频保存方法,将合成的视频保存到该路径中
# 'MJPG'意思是支持jpg格式图片
# fps = 5代表视频的帧频为5,如果图片不多,帧频最好设置的小一点
# (1280,720)是生成的视频像素1280*720,一般要与所使用的图片像素大小一致,否则生成的视频无法播放
# 定义保存视频目录名称和压缩格式,像素为1280*720
video = cv2.VideoWriter('D:/630/0706.mp4',cv2.VideoWriter_fourcc(*'XVID'),30,(1920,1080))
for i in range(1,len(list)):
#读取图片
img = cv2.imread('D:/630/21/'+list[i-1])
# resize方法是cv2库提供的更改像素大小的方法
# # 将图片转换为1280*720像素大小
# img = cv2.resize(img,(1280,720))
# 写入视频
video.write(img)
# 释放资源
video.release()
4.重命名
'''批量更改文件名,方便数据集处理,并且也避免了图片顺序会被打乱得问题'''
import os
# import re
# import sys
path = r'D:/630/21'
filelist = os.listdir(path)
filetype = '.png'
# for file in filelist:
# print(file)
for file in filelist:
Olddir = os.path.join(path, file)
# print(Olddir)
if os.path.isdir(Olddir):
continue
# os.path.splitext("path"):分离文件名与扩展名
filename = os.path.splitext(file)[0]
filetype = os.path.splitext(file)[1]
# zfill() 方法返回指定长度的字符串,原字符串右对齐,前面填充0
Newdir = os.path.join(path, filename.zfill(6) + filetype)
os.rename(Olddir, Newdir)