在制作数据集时,首先将网上搜集到的视频裁成图像,可是如何去实现呢?
考虑到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()用法及举例
# 其中VideoCapture中的0是参数,代表电脑的内置摄像头,
# 如果有两个内置摄像头则为0,1,
# 也可以放我们需要的视频路径,比如我自己的 D:\data\element\1.mp4
1.cap = cv2.VideoCapture(0)
# cap.read()代表按帧独取视频,
# 其中ret代表布尔值,读帧正确则返回True,返回False表示无数据后续break
# frame代表某帧的图像
2.ret,frame = cap.read()
# cv2.waitKey()代表等待键盘输入
# cv2.waitKey(1)代表延时1ms切换到下一帧图像
# cv2.waitKey(0)只显示当前帧的图像
3. cv2.waitKey(1)
# cap.release()释放摄像头
4. cap.release()
# 统计视频图片的数量
5. cap.get(cv2.CAP_PROP_FRAME_COUNT)
非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)
# D:\data\element
video_root = os.path.join(BASE_DIR, 'element')
# open the folder
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
# Create a new folder to hold the new dataset
New_Folder = makedir(BASE_DIR, 'FireVideo')
def video_to_photo():
# got all video files
for index, video_file in enumerate(video_dirs):
# got the video file root
video_file = os.path.join(video_root, video_file)
# read video
cap = cv2.VideoCapture(video_file)
# The number of videos cropped from the video
count = 0
Folder = makedir(New_Folder, str(index + 1))
# frames
fps = cap.get(cv2.CAP_PROP_FRAME_COUNT)
# whether it is opened normally
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! ")