我正在尝试使用相机驱动程序,OpenCV和C ++从多个摄像头捕获图像。我的目标是获得尽可能多的FPS,为此我发现将硬盘中的图像保存为最慢的操作。为了加快这个过程,我在每个单独的线程中进行保存。问题是,我仍然需要等待保存完成以避免捕获的图像被覆盖。这样做可以提供良好的效果,但由于未知原因,每30-40帧的速度提高10倍。
我正在通过创建一个存储图像的环形缓冲区来解决这个问题,因为这些突然下降的写入速度非常短。我使用这种方法取得了很好的效果,但不幸的是,对于3台以上的摄像机,摄像机驱动程序无法处理压力而我的程序停止,等待第4台摄像机的第一张图像被保存。我检查过,它不是CPU,因为3个摄像头+在磁盘中写入随机数据的线程工作正常。
现在,看看如何使用opencv减轻相机驱动程序的压力,我想创建一个OpenCV mat缓冲区来保存图像,同时保存图像而不用我的相机覆盖它们(好吧,直到缓冲区完成一个整体一圈,我将确保不会发生)。
我知道我能做到
your_file.exe > debug.txt
从相机写入的内存中初始化一帧。这并不能解决我的问题,因为它只会指向数据,当相机覆盖它时,它会破坏保存的图像。
如何创建具有给定大小和类型的矩阵,然后将内存的内容复制到此矩阵?
答案 0 :(得分:1)
您需要创建深层副本。您可以使用clone
:
cv::Mat colorFrame = cv::Mat(height, width, CV_8UC3, pointerToMemoryOfCamera).clone();
您还可以使用matwrite
and matread
functions加快保存图像的过程。