使用opencv-python(cv2)如何将视频裁成图像?

在制作数据集时,首先将网上搜集到的视频裁成图像,可是如何去实现呢?

考虑到opencv-python中有此类方法,故此篇博客由此诞生。


注意,视频文件在笔者文件:D:\data\element (由于此数据集现处于研究阶段,尚未发布,且对于笔者特别重要,于是将其马赛克)
使用opencv-python(cv2)如何将视频裁成图像?_第1张图片产生新的数据集在笔者文件:D:\data\Video
使用opencv-python(cv2)如何将视频裁成图像?_第2张图片一个视频会裁成很多图片于是,生成的数据集细分为:

D:\data\Video\1
D:\data\Video\2
D:\data\Video\3
D:\data\Video\4
D:\data\Video\5
D:\data\Video\6
注意123456为视频的名字产生的文件夹

需要用到的知识点:

参考博客: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! ")

结果:
在这里插入图片描述使用opencv-python(cv2)如何将视频裁成图像?_第3张图片
使用opencv-python(cv2)如何将视频裁成图像?_第4张图片

你可能感兴趣的:(python,opencv,计算机视觉)