gpt4 book ai didi

C++ OpenCV VideoWriter 帧率同步

转载 作者:行者123 更新时间:2023-12-02 16:09:07 25 4
gpt4 key购买 nike

我要从视频采集卡中捕捉帧。这些帧被处理并写入硬盘。整个设置处于多线程环境中,因此抓取器将图像写入队列,在另一个线程中处理图像,另一个线程写入硬盘。如果图像符合处理器的定义,则图像将写入硬盘。如果连续 10 个图像是“坏的”,则文件完成。如果有 9 张或更少的“坏”图像,所有图像都将与下一张好图像一起写入,这样文件编写器就会得到通知。

问题在这里,如果我不这样做,而是在处理完每个文件后直接写入,视频文件没问题,但是写入了 9 个“坏”图像。如果我按照上面的描述进行操作,则视频的速度/帧速率不合适。这个描述有点奇怪,所以这里只是一个简化的例子,所以你可以看到问题:

void FrameWriter::writeFrameLoop() {

string path = getPath();
cv::Size2i size(1350, 1080);
cv::VideoWriter videoWriter(path, fourcc, 30, size);

while (this->isRunning) {

while (!this->frames.empty()) {

usleep(100000); // this effects the speed/frame
videoWriter.write(this->pop());
}
std::this_thread::sleep_for(10ms);
}

videoWriter.release();
}

这个例子很简单,这里我用 sleep “阻塞”了写入过程,记住这是一个不同的线程。这意味着在捕获停止后,文件写入需要更长的时间。但我希望这不会影响视频本身,因为帧率为 30 并且图像的顺序仍然相同。但对我来说,当我不及时调用“videoWriter.write”时,它似乎会影响视频文件。在这种情况下,视频比预期的要快得多。我认为只有配置的 30 帧和写入图像的数量会影响视频速度,但事实并非如此。谁能帮我理解这里发生了什么?

我在 Ubuntu 18.04 上使用 openCV 4.4.0。谢谢您的帮助。BR迈克尔

最佳答案

我想我知道快速播放结果视频的原因了。

在构造函数 cv::VideoWriter videoWriter(path, fourcc, 30, size); 中,您将生成的视频的帧速率 (FPS) 设置为 30。这意味着 CV 库需要正好 30 帧由 write() 函数为每 1 秒的结果视频流写入。

另外,对于 CV 库,使用新帧调用 write() 的速度没有区别,您可以每秒调用 5 次或 10 次甚至 1000 次。唯一重要的是您必须为每一秒的视频提供恰好 30 帧,而提供这 30 帧的速度有多快并不重要。

我的意思是,您的所有 sleep(...) 功能对于 CV VideoWriter 类都无关紧要。所有视频渲染/转换库都是如此。所以暂停线程根本不会改变任何东西。

但在您的情况下,您是说每秒从采集器视频卡的实时视频数据中采集 10 帧。这意味着您的 FPS 实际上是每秒 10 帧。因此,为了正确解决您的任务,接下来应该做的事情:

  1. 删除所有暂停功能,例如调用 sleep()。根本不需要。并且不会改变 VideoWriter 的行为。
  2. 解决任务的第一种方法是将构造函数 cv::VideoWriter videoWriter(path, fourcc, 30, size); 的值从 30 更改为 10。这已经可以解决您的任务了,但你必须确保每秒抓取 10 帧,不能多也不能少。那么您的视频将是一个正确播放(正确速度)的视频,帧率为每秒 10 帧。这是最简单的解决方案。视频不需要达到 30 FPS 才能在以后正确播放,10 FPS 的视频以后可以由任何播放器正确播放。
  3. 另一种解决方案,如果您真的希望生成的视频每秒播放 30 帧,不多不少,则将抓取视频的每一帧复制 3 次,这样您将获得 10 帧中的 30 帧抓取的视频。通过复制我只是意味着你应该调用 videWriter.write(...) 三遍(在一个小循环中)同一个帧,调用这个 write 没有任何停顿(比如 sleep)。然后,您生成的视频将再次精确到每秒 30 帧。

我认为您只是想念CV::VideoWriter 的工作原理。您认为 write() 会实时呈现生成的视频,这意味着如果您将 10 帧输入它但正好在一秒内,那么它应该呈现正确的视频速度。但是作者不是实时渲染视频,这意味着它只是假设传递的 10 帧仅占生成视频的 1/3 秒,因此它预计在生成的 1 秒内写入 30 帧。

关于C++ OpenCV VideoWriter 帧率同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64173224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com