Python OpenCV 按帧分割视频为图片 批量修改文件名

yolov5炼丹需要大量图片,在手上有视频素材的前提下,可以截图大量图片。找了下网上的代码都不太符合要求,干脆自己写一个。

输入:指定位置文件夹里的全部视频

输出:指定位置文件夹,图片从0开始依次排好,就算截n个视频也不会重复标签。

如果有懂优化效率的可以帮忙看看代码,总感觉跑得有些慢……

import cv2
import os
import time

'''
注意路径名和文件名不能有中文
路径之间加双斜杠

'''

# 视频数据主目录,需要自行修改,否则报错
video_path = 'C:\\Users\\example\\videos\\origin video' 
# 帧文件保存目录,需要自行修改,否则报错
save_path = 'C:\\Users\\example\\videos\\saved picture' 

framerate = 3  # 每秒读取约30/n张图片,即每隔n帧截取一帧。修改该参数即可修改图片总数

# 视频读取函数
def video_split(v_name, # 读取视频名字
                pic_num, # 视频中帧总数
                framerate # 帧数截取间隔,每隔n帧截取一阵
                ):

    v_path = video_path + '\\' + v_name # 读取视频地址
    cap = cv2.VideoCapture(v_path) # 读取视频
    rval = cap.isOpened() # 判断是否读取成功

    while rval:
        rval, frame = cap.read() # 获取视频帧数图片
        if rval:
            if (pic_num % framerate == 0): # 符合第n帧取帧数图的条件
                cv2.imwrite(save_path + '\\' + str(int(pic_num/framerate)) + '.jpg', frame)
            pic_num += 1
            # cv2.waitKey(1)
    return pic_num # 返回第n个视频的帧总数


pic_num = 0 # 图片序号
video_num = 0 # 视频个数

start_time = time.time()
print('正在读取视频……')
videos = os.listdir(video_path) # 读取所有视频列表

if videos:

    print('正在截图,请稍后……')
    for video in videos:
        pic_num = video_split(video, pic_num, framerate)
        video_num += 1
    end_time = time.time()

    print('截取图片完成!')
    print(  '从'+
            str(video_num)+
            '个视频中共截取约'+
            str(int(pic_num/framerate))+
            '张图片,每秒截取约'+
            str("%.1f"%(30/framerate))+
            '张图片,共耗费'+
            str("%.2f"%(end_time - start_time))+
            '秒')

else:
    print('没有检测到视频。请在指定文件夹中放入视频,或检查文件夹路径是否错误')

如果要批量修改文件名的话可以使用如下python代码

import os
import time
 
# 文件路径,自行修改。注意最后也必须加\\
path = 'C:\\Users\\example\\videos\\origin video\\'
 
# 获取该目录下所有文件,存入列表中
fileList = os.listdir(path)
 
n = 0
for i in fileList:
    oldname = path + fileList[n] # 旧文件名(路径+文件名)
    newname = path + time.strftime("%Y%m%d_%H%M%S_", time.localtime()) + str(n)+ '.jpg' # 新文件名 日期+时间+编号
    os.rename(oldname,newname)   # 用os模块中的rename方法对文件改名
    print(oldname,'======>',newname)
    n+=1

参考:Python 批量修改文件名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值