在制作数据集时,首先将网上搜集到的视频裁成图像,可是如何去实现呢?
考虑到opencv-python中有此类方法,故此篇博客由此诞生。
注意,视频文件在笔者文件:D:\data\element (由于此数据集现处于研究阶段,尚未发布,且对于笔者特别重要,于是将其马赛克) 产生新的数据集在笔者文件:D:\data\Video 一个视频会裁成很多图片于是,生成的数据集细分为:
D:\data\Video\1
D:\data\Video\2
D:\data\Video\3
D:\data\Video\4
D:\data\Video\5
D:\data\Video\6
注意1、2、3、4、5、6为视频的名字产生的文件夹
需要用到的知识点:
参考博客:cv2.VideoCapture()用法及举例
1.cap = cv2.VideoCapture(0)
2.ret,frame = cap.read()
3. cv2.waitKey(1)
4. cap.release()
5. cap.get(cv2.CAP_PROP_FPS)
非cv2部分知识:
def makedir(name, phase):
filedir = os.path.join(name, phase)
if not os.path.exists(filedir):
os.makedirs(filedir)
return filedir
代码:
import cv2
import os
import sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
video_root = os.path.join(BASE_DIR, 'element')
video_dirs = os.listdir(video_root)
def makedir(name, phase):
filedir = os.path.join(name, phase)
if not os.path.exists(filedir):
os.makedirs(filedir)
return filedir
New_Folder = makedir(BASE_DIR, 'Video')
def video_to_photo():
for index, video_file in enumerate(video_dirs):
video_file = os.path.join(video_root, video_file)
cap = cv2.VideoCapture(video_file)
count = 0
Folder = makedir(New_Folder, str(index + 1))
fps = cap.get(cv2.CAP_PROP_FPS)
while cap.isOpened():
ret, frame = cap.read()
if frame is None:
break
if ret == True:
count += 1
if count < fps:
save_root = os.path.join(Folder, str(count) + '.jpg')
print("writing " + save_root + " ...")
cv2.imwrite(save_root, frame)
cv2.waitKey(1)
cap.release()
if __name__ == '__main__':
video_to_photo()
print("well done! ")
结果:
|