首先要先纠正个误区,用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()
|