制作视频数据集(一):截取视频帧

**

制作视频数据集(一):截取视频帧

**

1、smart player截取视频帧

直接下载smart player截取即可,我是觉得这个软件截取更简单一些,但我下载之后截取页面显示不了文件,搞不了,不清楚什么情况,不过可以抓图,手动截取帧,太麻烦了。

2、ffmpeg截取视频帧

链接: link.
截取很方便,截取图片会自动保存到C盘用户文件夹里,但是我想要图片保存到自定义的文件夹,不会设置。。。。

3、python - 截取指定帧数间隔的视频,并保存图片到指定位置

链接: link.

# -*- coding: utf-8 -*-
#!usr/bin/python
import cv2
import os.path
#使用opencv按一定间隔截取视频帧,并保存为图片

filepath = r'C:\\Users\\pippy\\Desktop\\Datasets\\MP4\\Anomaly_Videos_Part_2\\Fighting' #视频所在文件夹
pathDir=os.listdir(filepath)
a=1#图片计数
for allDir in pathDir:
    videopath=r'C:\\Users\\pippy\\Desktop\\Datasets\\MP4\\Anomaly_Videos_Part_2\\Fighting\\' + allDir
    print(videopath)
    #before
    vc=cv2.VideoCapture(videopath) #读入视频文件
    c=1
    
    if vc.isOpened():
        rval,frame=vc.read()
    else:
        rval=False
        
    timeF=25  #视频帧计数间隔频率
    
    while rval:#循环读取视频帧
        rval,frame = vc.read( )
        if(c%timeF == 0): #每隔timeF帧进行存储操作
            cv2.imwrite(r'C:\\Users\\pippy\\Desktop\\Datasets\\Pictures\\Anomaly_Videos_Part_2\\Fighting\\' +str(a) + '.jpg',frame) #存储为图像
            a=a+1
        c=c+1
        cv2.waitKey(1)
    vc.release()

一直报错:error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\imgcodecs\src\loadsave.cpp:715: error: (-215:Assertion failed) !_img.empty() in function ‘cv::imwrite’
解决方法:
1:确保文件路径不含中文名以及非法字符
2:路径前有没有加r,没有就加上
3:路径最后有没有加"\\",没有就加上
4:前面三种试了,多运行了一会还是报了相同的错。。。。显示保存第15个视频的时候出错,我就把15频删了,代码好像就正常了。。。大概是这个视频有问题,如果能解决最好,不能解决再试试把imwrite改成imencode,我后面又遇到这个问题了,但是不清楚怎么的突然就行了,反正这几种方法轮流改。。。

4 将一个文件夹中多个视频的视频帧保存在多个文件夹下

链接: link.
这个是一帧一帧截取的。

 # -*- coding: utf-8 -*-
import cv2
from skimage import io
import os
 # 视频所在文件夹的路径位置
videos_path = 'C:/Users/pippy/Desktop/Datasets/MP4/new_Anomaly_Videos_Part_2/Fighting'
 # 从视频文件夹中获取各个视频的名字
videos_name = os.listdir(videos_path)
 # 视频帧图片的起始编号
 # 遍历所有的视频
for j, i in enumerate(videos_name):
    # 以下两行代码的作用是为每段视频帧创建一个文件夹
    path = 'C:/Users/pippy/Desktop/Datasets/picture/video_picture_%s'%(j+1)
    os.makedirs(path)
    # 获取每个视频的路径
    video_path = os.path.join(videos_path, i)
    # 如果遇见文件夹就跳过
    if os.path.isdir(video_path):
        continue
    vc = cv2.VideoCapture(video_path) # 参数0表示第一个摄像头

    #判断视频是否打开
    if vc.isOpened():
        rval,frame=vc.read()
        print('Open')
    else:
        rval=False
        print('UnOpen')
    
    # 测试用,查看视频size
    size = (int(vc.get(cv2.CAP_PROP_FRAME_WIDTH)),
            int(vc.get(cv2.CAP_PROP_FRAME_HEIGHT)))
    print('size:'+repr(size))
    a=1
    c = 1
    timeF=100
    
    while rval:#循环读取视频帧
        rval,frame = vc.read( )
        if(c%timeF == 0): #每隔timeF帧进行存储操作
            cv2.imwrite(r"C:/Users/pippy/Desktop/Datasets/picture/video_picture_%s/%s.jpg"%(j+1,a),frame) #存储为图像
            a=a+1
        c=c+1
        cv2.waitKey(1)
    vc.release()
    
cv2.destroyAllWindows()

这个可以实现每隔多少帧进行提取。

你可能感兴趣的:(制作视频数据集(一):截取视频帧)