cv2.VideoWriter的输出不正确。它更快

时间:2018-03-30 02:30:00

标签: python opencv image-processing video raspberry-pi

我正在尝试使用opencv的cv2.VideoWriter来录制视频一段时间。问题是输出不正确。例如,10秒的视频只有2秒,而且速度更快,播放速度更快。 这是我的代码。欢迎任何建议或想法。另外,另一个问题是输出视频是静音。谢谢!!!

主持人:Raspberry Pi

语言:Python

import numpy as np
import cv2
import time

# Define the duration (in seconds) of the video capture here
capture_duration = 10

cap = cv2.VideoCapture(0)

# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output3.avi',fourcc, 20.0, (640,480))

start_time = time.time()
while( int(time.time() - start_time) < capture_duration ):
    ret, frame = cap.read()
    if ret==True:
        frame = cv2.flip(frame,0)

        # write the flipped frame
        out.write(frame)

    else:
        break

# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()

1 个答案:

答案 0 :(得分:0)

您忽略了代码中的两个重要因素:

while循环中的帧数:

您希望以每秒20帧(fps)的速度写入10秒的视频。这为整个视频提供了总共200帧。为此,您需要在捕获每个帧并将其写入文件之前,注意while循环内的等待时间。如果忽略等待期,则:

  frameCount = 0
  while( int(time.time() - start_time) < capture_duration ):
      # we assume that all the operations inside the loop take 0 seconds to accomplish.

      frameCount = frameCount+1

  print('Total frames: ',frameCount)

在上面的示例中,您会注意到,通过忽略等待时间,您将在10秒内将数千帧写入视频文件。现在10帧20帧的帧会给你200帧,为了达到这个帧数,你需要50毫秒的等待时间才能将每帧写入文件。

  frameCount = 0
  while( int(time.time() - start_time) < capture_duration ):
      # wait 50 milliseconds before each frame is written.
      cv2.waitKey(50)

      frameCount = frameCount+1

  print('Total frames: ',frameCount)

在上面的示例中,总帧数约为200.

VideoCapture::read()是阻止I / O调用:

cap.read()函数执行两项操作,即VideoCapture::grab()VideoCapture::retrieve()。此功能等待下一帧被抓取,然后解码并返回图像。等待时间取决于您的相机fps

因此,例如,如果你的相机fps是6,那么在10秒内你就可以拍摄60帧。您已将20 fps设置为VideoWriter属性;以20 fps播放的60帧可为您提供约3秒的视频。

要查看相机在10秒内捕获的帧数:

  frameCount = 0
  while( int(time.time() - start_time) < capture_duration ):
      # wait for camera to grab next frame
      ret, frame = cap.read()
      # count number of frames
      frameCount = frameCount+1

  print('Total frames: ',frameCount)