Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV:尽可能快速、及时地处理摄像机输入。刷新读取缓冲区以跳过旧帧_C++_Opencv_Buffer_Video Capture_Flush - Fatal编程技术网

C++ OpenCV:尽可能快速、及时地处理摄像机输入。刷新读取缓冲区以跳过旧帧

C++ OpenCV:尽可能快速、及时地处理摄像机输入。刷新读取缓冲区以跳过旧帧,c++,opencv,buffer,video-capture,flush,C++,Opencv,Buffer,Video Capture,Flush,使用cv::VideoCapture的一个实例,可以从相机中读取帧。如果应对这些帧进行处理(例如检测qr码或任何其他特征),且处理时间长于摄像机的帧周期,则会有帧缓冲。因此,如果完成一帧,则应读取下一帧。但为了尽可能响应,下一步应处理可用的最新帧,而不是旧的缓冲帧 如何从cv::VideoCapture中获取最新帧? 可以使用grab()(请参阅)跳过帧。但似乎无法确定我们是否达到了最新的框架。没有缓冲帧计数,没有“抓取最后一个”指示,没有“刷新读取缓冲区” 我在这里提出的唯一建议是使用多线程尽

使用
cv::VideoCapture
的一个实例,可以从相机中读取帧。如果应对这些帧进行处理(例如检测qr码或任何其他特征),且处理时间长于摄像机的帧周期,则会有帧缓冲。因此,如果完成一帧,则应读取下一帧。但为了尽可能响应,下一步应处理可用的最新帧,而不是旧的缓冲帧

如何从
cv::VideoCapture
中获取最新帧?

可以使用
grab()
(请参阅)跳过帧。但似乎无法确定我们是否达到了最新的框架。没有缓冲帧计数,没有“抓取最后一个”指示,没有“刷新读取缓冲区”

我在这里提出的唯一建议是使用多线程尽可能快地读取缓冲区,并将最新帧移交给工作线程。这些都是嵌入式开发人员感到头疼的事情。使用多线程刷新缓冲区,就像。。。(我不需要解释)

真的没有办法像CPU那样快速地处理相机图像吗

只需一点代码:

for ( ;; ) {
  vcap.grab();
  vcap.retrieve( frame );
  usleep( 990000UL );                  // wait 990ms for nothing
  cv::imshow( windowName, frame );
  if ( cv::waitKey( 10 ) >= 0 ) break; // wait 10ms for keypress
}

这将显示延迟数秒(不是一秒)的帧(使用
read()
>
是相同的)。

我认为如果您从网络摄像头抓取,您将抓取最近的帧。如果处理时间超过帧周期,将丢失丢失的帧。当你从视频中抓取时,你将抓取所有帧。据我所知,
grab()
retrieve()
(解码)只是
read()
的两个组成部分:“抓取、解码并返回下一个视频帧。”。“grab()”和“retrieve()”的序列相当于一次调用
read()
。我想如果你从网络摄像头抓取,你会抓取最近的一帧。如果处理时间超过帧周期,将丢失丢失的帧。当你从视频中抓取时,你将抓取所有帧。据我所知,
grab()
retrieve()
(解码)只是
read()
的两个组成部分:“抓取、解码并返回下一个视频帧。”。“grab()”和“retrieve()”的序列相当于一次调用
read()