使用OpevCV VideoWriter实时录制视频

尼克·托珀(Nick Topper)

我有几个OpenCV项目,它们通过USB分析视频,并且在某些情况下必须将视频流记录到文件中。使用我的软件的人抱怨,超过10分钟的录制内容会产生比应有的时间长约20秒的视频文件。

我正在使用openCV的VideoWriter。尝试将CV2_CAP_PROP_FPS设置为非常低的设置,然后尝试在几秒钟内获得平均帧速率,以便为我的输出文件的帧速率找到合适的设置。仍无法满足我的实时需求。

有人知道确保我的视频接近实时录制的好方法吗?我是否应该使用time.sleep之类的内容(在python中)来限制帧速率?还是有更好的方法来做到这一点?

乌尔里希·斯特恩

我写了一个实时跟踪器(用于神经生物学研究),我将其用于许多网络摄像头,并注意到我的某些相机不能非常精确地遵循帧速率。它们可能快或慢。为了保存“合理正确”的视频,从网络摄像头捕获帧的代码调用了我VideoWriterwrite(frame)方法,该方法将帧放入队列中,并通过单独的“ writer”线程以恒定速率写入帧来检索帧。如果编写器线程在要写入下一帧时发现队列为空,则会重复最后一帧。如果编写器线程在队列中找到多个帧,它将写入最新的帧并丢弃其他帧。(一个人可以在没有单独线程的情况下实现此功能,但是对于实时跟踪器来说,write(frame)快速返回是一件好事。)

下面摘录自我的代码。它们不会逐字显示,而是显示我刚才描述的内容。(我计划在接下来的几周内将实时跟踪器放置在GitHub上。)

class VideoWriter:

  def __init__(self, fn=None, fcc='MJPG', fps=7.5):
    ...
    self.fcc, self.fps, self.dt = fcc, fps, 1./fps
    self.q, self._stop, self.n = Queue.Queue(), False, 0
    self.wrtr = threading.Thread(target=self._writer)
    self.wrtr.start()

  def _writer(self):
    frm = firstTime = vw = None
    while True:
      if self._stop:
        break
      # get most recent frame
      while not self.q.empty():
        frm = self.q.get_nowait()
      if frm is not None:
        if vw is None:
          vw = cv2.VideoWriter(self.fn+self._EXT, cvFourcc(self.fcc),
            self.fps, imgSize(frm), isColor=numChannels(frm)>1)
          firstTime = time.time()
        vw.write(frm)
        self.n += 1
      dt = self.dt if firstTime is None else max(0,
        firstTime + self.n*self.dt - time.time())
      time.sleep(dt)

  # write frame; can be called at rate different from fps
  def write(self, frm):
    self.q.put(frm)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章