从指针更改OpenCV矩阵的数据

时间:2017-03-30 14:53:04

标签: c++ opencv camera computer-vision

我正在尝试使用相机驱动程序,OpenCV和C ++从多个摄像头捕获图像。我的目标是获得尽可能多的FPS,为此我发现将硬盘中的图像保存为最慢的操作。为了加快这个过程,我在每个单独的线程中进行保存。问题是,我仍然需要等待保存完成以避免捕获的图像被覆盖。这样做可以提供良好的效果,但由于未知原因,每30-40帧的速度提高10倍。

我正在通过创建一个存储图像的环形缓冲区来解决这个问题,因为这些突然下降的写入速度非常短。我使用这种方法取得了很好的效果,但不幸的是,对于3台以上的摄像机,摄像机驱动程序无法处理压力而我的程序停止,等待第4台摄像机的第一张图像被保存。我检查过,它不是CPU,因为3个摄像头+在磁盘中写入随机数据的线程工作正常。

现在,看看如何使用opencv减轻相机驱动程序的压力,我想创建一个OpenCV mat缓冲区来保存图像,同时保存图像而不用我的相机覆盖它们(好吧,直到缓冲区完成一个整体一圈,我将确保不会发生)。

我知道我能做到

your_file.exe > debug.txt

从相机写入的内存中初始化一帧。这并不能解决我的问题,因为它只会指向数据,当相机覆盖它时,它会破坏保存的图像。

如何创建具有给定大小和类型的矩阵,然后将内存的内容复制到此矩阵?

1 个答案:

答案 0 :(得分:1)

您需要创建深层副本。您可以使用clone

cv::Mat colorFrame = cv::Mat(height, width, CV_8UC3, pointerToMemoryOfCamera).clone();

您还可以使用matwrite and matread functions加快保存图像的过程。