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()
。