【发布时间】:2018-06-29 02:41:30
【问题描述】:
假设我们在 OpenCV 中有一个名为 process 的进程,当我们调用它时,它需要大约 2 秒才能在一帧上完成。
当我们使用Videocapture 捕获我们的帧时,帧存储在缓冲区中,当第第n 帧 上的process 完成时,它会抓取下一帧((n+1 )th frame),但是,我想实时抓取这些帧,而不是按顺序。
例如你可以测试下面的例子
Mat frame;
VideoCapture cap("rtsp url");
while (true) {
cap.read(frame);
imshow("s",frame);
waitKey(2000); //artificial delay
}
运行上面的例子,你会看到显示的帧属于过去,而不是现在。我想知道如何跳过这些帧?
【问题讨论】:
-
请尝试添加一些标点符号以使您的问题更容易理解。
-
对不起,我不是本地人(我尽力了),但是如果你运行示例代码,你就会明白我想说的话
-
为了做到这一点,您必须编写对处理函数的非阻塞调用 - 即使用线程。 OpenCV 本身不提供这样的功能。否则,无论您做什么,如果处理时间超过帧之间的间隔,它都会阻止视频捕获调用。
-
@MaxWalczak 你能发表一个答案吗
-
类似于 Max.... 可能会在程序的开头启动第二个线程,该线程与当前线程连续运行并并行运行。它会说 4 或 8 个缓冲区 (Mats),它按循环顺序获取,Mat[0]、Mat[1]、Mat[2]、Mat[3]、Mat[0]、Mat[1].. .. 当您当前的线程想要一个新帧时,它会检查另一个线程当前正在获取哪一个并获取之前的一个,即最近完成的一个。我建议使用几个垫子,这样你就不可能拿一个在你拿它的时候仍然被覆盖的垫子。