对视频数据集制作分成以下几个步骤:
1. 找到相对应的视频
2. 将视频剪辑成相应的片段
3. 通过代码对视频取帧
# -*- coding: utf-8 -*-
#这句注释是为了能够识别中文注释
import cv2
vc = cv2.VideoCapture('D:\\DATASET\\Emily.avi')
#cv只能识别avi格式的视频,因此拿到其他格式的视频首先要对格式进行转变。
c=1
if vc.isOpened():
rval, frame = vc.read()
else:
rval = False
timeF = 100
# 这代表隔多久取一次帧
while rval:
rval, frame = vc.read()
if(c%timeF==0):
# 将帧写入文件夹
cv2.imwrite('D:\\DATASET\\gan_picture\\emily\\step1\\'+str(c)+'.jpg',frame)
c= c+1
cv2.waitKey(1)
vc.release()
4. 对每一帧的视频去黑边
# -*- coding: utf-8 -*-
'''
去黑边的操作其实很好理解,因为电影中往往有上下黑边,从实际来讲就是,我们只要找到黑边的位置,然后进行剪切就可以了。关键在于确定黑边的位置。在我这里是通过手动尝试的。几个像素,通过微信截图可以大致确定。
'''
import cv2
import os
import datetime
import matplotlib.pyplot as plt
def change_size(read_file):
#通过cv读取图片
image=cv2.imread(read_file,1)
#知道图像的高度
height=image.shape[0]
#cv是从上到下。从左往右显示图片。
pre1_picture=image[8:height-8,:]
return pre1_picture
source_path="D:\\DATASET\\train for cyclegan\\testB\\"
save_path="D:\\DATASET\\train for cyclegan\\testB\\"
if not os.path.exists(save_path):
os.mkdir(save_path)
# 列出所有的图像文件
file_names=os.listdir(source_path)
starttime=datetime.datetime.now()
for i in range(len(file_names)):
#对每一个图像文件执行crop操作。
x=change_size(source_path + file_names[i])
#将剪切过的图像重新写入。
cv2.imwrite(save_path+file_names[i],x)
print(file_names[i])
print(i)
5. 对图像进行重命名
# -*- coding: utf-8 -*-
#记住这个命令,在每一个代码之前加入这个
import os
def rename(path):
filelist = os.listdir(path)
#对文件夹中给的文件按照序列进行排序。因为图片是有顺序的
files.sort(key=lambda x: int(x.split('.')[0]))
for file in filelist: #os.listdir('.')遍历文件夹内的每个文件名,并返回一个包含文件名的list
if file[-2: ] == 'py':
continue #过滤掉改名的.py文件
name = file.replace('testA', '') #去掉空格
os.rename(os.path.join(path,file),
os.path.join(path,name))
rename(r'D:\DATASET\train for cyclegan\cropped\\')
6. 对所有图像进行缩放
# -*- coding:uft-8 -*-
import cv2
import os
import os
def cutimage(dir):
files = os.listdir(dir)
files.sort(key=lambda x: int(x.split('.')[0]))
i = 0
for path in files:
full_path = os.path.join(dir, path)
# print(full_path)
image = cv2.imread(full_path) # opencv剪切图片,得到三维矩阵数据
# 缩放至定尺寸w*h
dim = (256, 256)
resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
#这里采用的插值法是INTER_LINEAR
i+=1
cv2.imwrite("D:/DATASET/train for cyclegan/trainB/{}.jpg".format(str(i)), resized)
#保存文件
cv2.waitKey(0) # 退出
dir = 'D:/DATASET/train for cyclegan/cropB'
cutimage(dir)
vc.release()
基本上按照上面的几步就能得到想要的数据集了。再整理一下,就可以进行训练了。
2022.10.24更新:
感谢各位通过搜索看到我的这篇文章,这篇文章是我研二开学,也就是19年的时候写的。
现在我已经研究生毕业,工作一年了。 现在依旧每天有很多人通过这篇文章关注到我,说明视频方向依旧火热。
跟各位汇报一下,我研究生期间发表了两篇视频相关的论文,一篇ICME,一篇ICIP。
ICME 如下:
Yaxin Liu, Xiaoyan Zhang*, Xiaogang Xu, “Semantic-Aware Video Style Transfer Based On Temporal Consistent Sparse Patch Constraint”, IEEE International Conference on Multimedia and Expo (ICME), 2021, oral, accepted.
ICIP 链接如下:
Y. Liu, X. Zhang and X. Xu, "Reference-Based Video Colorization With Multi-Scale Semantic Fusion And Temporal Augmentation," 2021 IEEE International Conference on Image Processing (ICIP), 2021, pp. 1924-1928, doi: 10.1109/ICIP42928.2021.9506422.
但目前在京东从事前端工作。 如果小伙伴们有算法、前端相关问题,欢迎来问我。同时,工作这一年我也有很多择业、职业规划上的体会,欢迎小伙伴们来一起探讨。
我的微信: jks129434193。