**
制作视频数据集(一):截取视频帧
**
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()
这个可以实现每隔多少帧进行提取。