【发布时间】:2017-08-24 14:01:43
【问题描述】:
我正在尝试使用相机驱动程序、OpenCV 和 C++ 从多个相机捕获图像。我的目标是获得尽可能多的 FPS,为此我发现将图像保存在硬盘中是最慢的操作。为了加快这个过程,我在单独的线程中进行每个保存。问题是,我仍然必须等待保存完成以避免捕获的图像被覆盖。这样做可以提供很好的结果,但由于未知原因,每 30-40 帧速度会提高 10 倍。
我正在通过创建一个存储图像的环形缓冲区来解决这个问题,因为这些写入速度的突然下降非常短。我使用这种方法获得了非常好的结果,但不幸的是,对于超过 3 个摄像头,摄像头驱动程序无法处理压力,我的程序停止,等待第 4 个摄像头的第一张图像被保存。我检查了一下,这不是 CPU,因为 3 个摄像头 + 一个在磁盘中写入随机数据的线程工作正常。
现在,看到使用 opencv 如何减轻相机驱动程序的压力,我想创建一个 OpenCV 垫缓冲区来保存图像,同时保存它们而不用我的相机覆盖它们(好吧,直到缓冲区完成整个圈,我会确保不会发生)。
我知道我能做到
cv::Mat colorFrame(cv::Size(width, height),CV_8UC3,pointerToMemoryOfCamera);
从相机写入的内存中初始化一帧。这并不能解决我的问题,因为它只会指向数据,而相机覆盖它的那一刻,它会破坏保存的图像。
如何创建一个给定大小和类型的矩阵,然后将内存中的内容复制到这个矩阵中?
【问题讨论】:
标签: c++ opencv camera computer-vision