Python 第三方模块之 opencv - 视频截取

首先要先纠正个误区,用OpenCV做多媒体开发,真的是很搞笑,OpenCV这东西再强大,这方面也不行的,之所以把视频读取写入这部分做的强大一些,也是为了方便大家做视频处理的时候方便些,而且这部分也是基于vfw和ffmpeg二次开发的,功能还是很弱的。一定要记住一点,OpenCV是一个强大的计算机视觉库,而不是视频流编码器或者解码器。希望大家不要走入这个误区,可以把这部分简单单独看待。

目前,OpenCV只支持avi的格式,而且生成的视频文件不能大于2GB,而且不能添加音频。

如果你想突破这些限制,建议最好还是看看 ffMpeg, 而不是浪费时间在OpenCV上。不过也可以利用视频后期合成工具制作。闲言少叙,进入重点VideoWriter类。

这个类是highgui交互很重要的一个工具类,可以方便我们容易的将图片序列保存成视频文件。类内成员函数有构造函数,open,isOpened,write(也可以用<<),使用还是很简单的。

使用很简单,先调用构造函数确定文件的名称,格式,帧率,帧大小,是否彩色。其中格式作为第二个参数,OpenCV提供的格式是未经过压缩的,目前支持的格式如下:

1
2
3
4
5
6
7
8
CV_FOURCC('P', 'I', 'M', '1') = MPEG-1 codec
CV_FOURCC('M', 'J', 'P', 'G') = motion-jpeg codec
CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec
CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec
CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec
CV_FOURCC('U', '2', '6', '3') = H263 codec
CV_FOURCC('I', '2', '6', '3') = H263I codec
CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec

然后就<<不停的把image传进去就行啦。上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
def cut_video(video_file):
print(video_file)
print(os.path.exists(video_file))
# 导入视频文件,参数:0 自带摄像头,1 USB摄像头,为文件名时读取视频文件
video_caputre = cv.VideoCapture(video_file)

# 获取读入视频的参数
fps = video_caputre.get(cv.CAP_PROP_FPS)
width = video_caputre.get(cv.CAP_PROP_FRAME_WIDTH)
height = video_caputre.get(cv.CAP_PROP_FRAME_HEIGHT)

print("fps:", fps)
print("width:", width)
print("height:", height)

# 定义截取尺寸,后面定义的每帧的h和w要于此一致,否则视频无法播放
# 注意 这里是高宽 (height, width)
size = (int(height), int(width))

# 创建视频写入对象
fourcc = cv.VideoWriter_fourcc(*'XVID')
# fourcc = cv.VideoWriter_fourcc('M', 'J', 'P', 'G')
video_write = cv.VideoWriter("01videoFrameTarget.avi", fourcc, fps, size)

frame_skip = 1
frame_now = 0
# 读取视频帧,然后写入文件并在窗口显示
success, frame_src = video_caputre.read()
while success and not cv.waitKey(1) == 27: # 读完退出或者按下 esc 退出
frame_now += 1
if frame_now <= frame_skip:
continue
# [width, height] 要与上面定义的size参数一致,注意参数的位置
# frame_target = frame_src[0:int(width), 0:int(height)]
frame_target = frame_src
# 写入视频文件
video_write.write(frame_target)

# 显示裁剪的视频和原视频
# cv.imshow("video", frame_target)
# cv.imshow("Video_src", frame_src)

# 不断读取
success, frame_src = video_caputre.read()

print("视频裁剪完成")

# 销毁窗口,释放资源
# cv.destroyWindow("video")
# cv.destroyWindow("Video_src")
video_caputre.release()
video_write.release()
cv.destroyAllWindows()

Python 第三方模块之 opencv - 视频截取
https://flepeng.github.io/021-Python-31-Python-第三方模块-Python-第三方模块之-opencv-视频截取/
作者
Lepeng
发布于
2021年4月27日
许可协议