Python学习笔记---将多个视频按照指定帧数批量抽取图片并保存至不同文件夹

笔记:
1.用os库中的os.walk()函数遍历多个子目录下的视频文件,可以灵活应用于“多个子文件夹,多个视频文件”和“只有一个子文件夹,只有一个视频”的不同情况

#循环遍历多级目录下的文件夹和文件
for root, dirs, files in os.walk()

2.不同视频的图片分别保存在不同的文件夹,文件夹命名可以沿用视频名,但在实际应用中,会遇到各式各样的视频名称,为保证输出的文件夹的规范性,可用“日期+后缀”命名

# 以“日期+后缀”对文件夹命名
os.mkdir(images_path + '/' + '0324_%d' % i)
img_full_path = os.path.join(images_path, '0324_%d' % i) + '/'
# 以“原视频名”对文件夹命名
os.mkdir(images_path + '/' + file_name.split('.')[0])
img_full_path = os.path.join(images_path, file_name.split('.')[0]) + '/'

3.用OpenCV库读取根目录下所有视频文件

#cv2.VideoCapture()根据路径读取视频文件
videos_full_path = os.path.join(root, file_name)
cap = cv2.VideoCapture(videos_full_path)

4.按照指定帧数抽取图片,指定帧数和原视频的帧率会影响抽取到的图片数量,根据个人需求设置帧数

#这里表示每隔50帧抽取1张图片
frame_count += 1
if frame_count % 50 == 0

5.在某些实际应用项目中,例如深度学习,需要用到指定分辨率大小的图片数据集

#将抽取到的图片直接resize到指定的分辨率
frame = cv2.resize(frame, (1280, 720))

6.对于图片的命名,在后期的某些操作中避免出现重名情况,图片命名也可以有两种方式

#以“日期+后缀+帧数”对图片命名
name = img_full_path + "0324_%d_%06d.jpg" % (i, frame_count)
# 以“原视频名+帧数”对图片命名
name = img_full_path + file_name.split('.')[0]+"_%06d.jpg" % (frame_count)

7.视频存放的文件夹和图片存放的文件夹应保持在同一级目录下(如下图)
image-20210402092834165
参考博文:
python批量和单独将视频转为图片帧

整体代码如下:

#!/usr/bin/env python
# coding=utf-8

import os
import cv2

# 视频路径和图片保存路径
videos_path = r"E:\dataset\ZhongChe_data\sdg\0319\videos"
images_path = r"E:\dataset\ZhongChe_data\sdg\0319\images"
if not os.path.exists(images_path):
    os.makedirs(images_path)

# 遍历读取视频文件---支持多级目录下的视频文件遍历
i = 0
file_count = 0
for root, dirs, files in os.walk(videos_path):
    for file_name in files:
        file_count += 1
        i += 1
        # os.mkdir(images_path + '/' + '0324_%d' % i)
        # img_full_path = os.path.join(images_path, '0324_%d' % i) + '/'
        os.mkdir(images_path + '/' + file_name.split('.')[0])
        img_full_path = os.path.join(images_path, file_name.split('.')[0]) + '/'
        videos_full_path = os.path.join(root, file_name)
        cap = cv2.VideoCapture(videos_full_path)
        print('\n开始处理第 ', str(i), ' 个视频:'+file_name)

        # 以指定帧数抽取图片并保存
        frame_count = 0
        ret = True
        while ret:
            ret, frame = cap.read()
            frame_count += 1
            if frame_count % 50 == 0:
                # frame = cv2.resize(frame, (1280, 720))               
                # name = img_full_path + "0324_%d_%06d.jpg" % (i, frame_count)
                name = img_full_path + file_name.split('.')[0]+"_%06d.jpg" % (frame_count)
                cv2.imwrite(name, frame)
      
print('\n一共 ', str(file_count), ' 个视频,', '已全部处理完毕!')
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值