Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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++;管理图像的大缓冲区 我有一个C++应用程序,它读取并处理视频流。我有两个线程:一个线程读取流,另一个线程进行处理。我使用OpenCV VideoCapture访问流,并将帧(cv::Mat)放入缓冲区。从另一个线程,我从缓冲区读取帧并处理它们_C++_Multithreading_Opencv_Buffer_Mat - Fatal编程技术网

C++;管理图像的大缓冲区 我有一个C++应用程序,它读取并处理视频流。我有两个线程:一个线程读取流,另一个线程进行处理。我使用OpenCV VideoCapture访问流,并将帧(cv::Mat)放入缓冲区。从另一个线程,我从缓冲区读取帧并处理它们

C++;管理图像的大缓冲区 我有一个C++应用程序,它读取并处理视频流。我有两个线程:一个线程读取流,另一个线程进行处理。我使用OpenCV VideoCapture访问流,并将帧(cv::Mat)放入缓冲区。从另一个线程,我从缓冲区读取帧并处理它们,c++,multithreading,opencv,buffer,mat,C++,Multithreading,Opencv,Buffer,Mat,有时处理可能会花费很多时间,处理线程开始落后(而帧以相同的速度放入队列)。这会增加缓冲区大小,最终可能占用所有可用内存并挂起整个系统。我知道如果内存不足,Windows会使用pagefile,但系统仍然会变得相当滞后。我需要确保这不会发生 我考虑设置缓冲区大小的限制,并在缓冲区已满时将帧卸载到磁盘。然后在有空间时将它们读回队列中。这样行吗?有什么好的选择吗?如何处理这样的问题?我当前的方法(图像队列)有效吗?请给出建议。如果处理线程始终赶不上,会发生什么?为什么不使用多个线程进行处理?每个帧都应

有时处理可能会花费很多时间,处理线程开始落后(而帧以相同的速度放入队列)。这会增加缓冲区大小,最终可能占用所有可用内存并挂起整个系统。我知道如果内存不足,Windows会使用pagefile,但系统仍然会变得相当滞后。我需要确保这不会发生


我考虑设置缓冲区大小的限制,并在缓冲区已满时将帧卸载到磁盘。然后在有空间时将它们读回队列中。这样行吗?有什么好的选择吗?如何处理这样的问题?我当前的方法(图像队列)有效吗?请给出建议。

如果处理线程始终赶不上,会发生什么?为什么不使用多个线程进行处理?每个帧都应该有一个时间戳,因此以正确的顺序重建输出流应该相当简单。我考虑设置缓冲区大小的限制,并在缓冲区已满时将帧卸载到磁盘。这不正是将页面交换到页面文件所做的吗?关于这一点的另一个想法是内存映射文件。然而,在第一手资料中,我想尝试一下@G.M.@Richard Criten推荐的方法,这种情况不太可能发生,所以现在不太需要担心。如果帧生成速度比处理速度快,那么问题就无法解决。最终,任何方案都将耗尽资源。您必须能够以至少与生成帧相同的速度使用帧,否则任何算法都无法工作。