当前位置: 首页 > 工具软件 > VideoCapture > 使用案例 >

opencv的videocapture 和VideoWriter简单使用

臧烨烁
2023-12-01

OpenCV中对于视频处理提供了VideoCapture和VideoWriter两个类进行处理,理论上支持各种视频格式。不过最终在电脑上支持的格式还是要取决于操作系统和OpenCv的构建配置。接下来,让我尝试了对一个视频进行复制,代码如下:

import cv2
video = cv2.VideoCapture('AMV.mp4')
fps = video.get(cv2.CAP_PROP_FPS) #获得视频帧数
size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)),
        int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))  #获得视频画面的宽高
videowriter = cv2.VideoWriter('MyAmv.avi',cv2.VideoWriter_fourcc('I','4','2','0'),fps,size)

success,frame = video.read()
while success:  #循环读取帧数
    videowriter.write(frame)
    success,frame = video.read()

但是这个操作仅仅是对图像进行操作,也就是只复制了视频,没有声音。

关于对视频视频编码器(cv2.VideoWriter_fourcc())的说明:

  1. 0:这个选项表示未压缩的原始视频文件。文件扩展名应该是.avi。
  2. cv2.VideoWriter_fourcc('I','4','2','0'):这个选项表示未压缩的YUV编码,4:2:0色度抽样。这种编码是广泛兼容的,但是会产生大的文件。文件扩展名应该是.avi。
  3. cv2.VideoWriter_fourcc('P','I','M','1'):这个选项应该是MPEG-1。文件扩展名应该是.avi。
  4. cv2.VideoWriter_fourcc('X','V','I','D'):这个选项是一种相对较旧的MEPG-4编码。如果想要限制生成视频的大小,这是一个不错的选项。文件扩张名应该是.avi。
  5. cv2.VideoWriter_fourcc('M','P','4','V'):这个选项是另一种相对较旧的MPEG-4编码。如果想限制生成的视频大小,这是一个不错的选择。文件扩展名应该是.mp4。
  6. cv2.VideoWriter_fourcc('X','2','6','4'):这个选项是一种相对较新的MPEG-4编码。如果想要限制生成的视频大小,这可能是最佳的选项。文件扩展名应该是.mp4。
  7. cv2.VideoWriter_fourcc('T','H','E','O'):这个选项表示Ogg Vorbis。文件扩展名应该是.ogv。
  8. cv2.VideoWriter_fourcc('F','L','V','1'):这个选项表示Flash视频。文件扩展名应该是.flv。

需要注意的是,帧率和帧的大小也必须指定,可以通过VideoCapture类的get方法进行读取。


有关摄像头的使用

摄像头的图像我们也可以可以通过VideoCapture进行获得,通过传递摄像头的设备索引(而不是视频文件名称)来构造VideoCapture对象。

import cv2

camera = cv2.VideoCapture(0)
fps = 30 #设置帧数
size = (int(camera.get(cv2.CAP_PROP_FRAME_WIDTH)),
        int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT))) #获得图像宽高

videoWriter = cv2.VideoWriter('camera.avi',cv2.VideoWriter_fourcc('I','4','2','0'),fps,size)

success,frame = camera.read() #返回false/True,帧/None
numFramesRemaining = 10*fps - 1 #10 seconds of frames
while success and numFramesRemaining>0:
    videoWriter.write(frame)
    success,frame = camera.read()
    numFramesRemaining -=1

上述代码实现了利用摄像头保存一段十秒的视频。但是如果摄像头出错也可能会无法运行,因此可以在上述代码中加入 VideoCapture.isOpened方法进行判断,返回一个布尔值。

当使用一组多个相机时,read()方法将是不合适的,此时我们可以使用如下方法(一组两台摄像机):

success0 = camera0.grab()
success1 = camera1.grab()
if success0 and success1:
    frame0 = camera0.grab()
    frame1 = camera1.grab()

 类似资料: