C++ 从Kinect捕获图像帧并保存到硬盘

C++ 从Kinect捕获图像帧并保存到硬盘,c++,arrays,opencv,memory-leaks,kinect-sdk,C++,Arrays,Opencv,Memory Leaks,Kinect Sdk,我的目标是以每秒30帧的速度从Kinect捕获所有RGB帧,并将它们保存到我的硬盘上。为此,我采取了以下方法 从Kinect获取帧并将其存储在阵列缓冲区中。由于使用imwrite写入磁盘需要一点时间,而且这样做时可能会丢失一些帧,因此我没有直接将它们保存到磁盘,而是将它们存储在一个数组中。现在,我有了另一个并行线程,它访问这个阵列并将各个帧作为映像写入磁盘 现在我使用了一个3000大小的静态数组和Mat类型。这就足够了,因为我需要存储1.5分钟视频的帧1.5分钟=2700帧。我已声明数组如下:

我的目标是以每秒30帧的速度从Kinect捕获所有RGB帧,并将它们保存到我的硬盘上。为此,我采取了以下方法

从Kinect获取帧并将其存储在阵列缓冲区中。由于使用imwrite写入磁盘需要一点时间,而且这样做时可能会丢失一些帧,因此我没有直接将它们保存到磁盘,而是将它们存储在一个数组中。现在,我有了另一个并行线程,它访问这个阵列并将各个帧作为映像写入磁盘

现在我使用了一个3000大小的静态数组和Mat类型。这就足够了,因为我需要存储1.5分钟视频的帧1.5分钟=2700帧。我已声明数组如下:

#define NUM_FRAMES 3000
Mat rgb[NUM_FRAMES];
我已经通过读取图像并使用以下代码将其保存到阵列来测试此限制:

for(int i=0; i<NUM_FRAMES; i++)
{
   Mat img = imread("image.jpg", CV_LOAD_IMAGE_COLOR);
   rgb[i] = img;
   imshow("Image", img);
   cvWaitKey(10);
}
现在我的问题就在这里。每当我将define FLAG设置为true时,它都会导致内存泄漏并给我OpenCv错误:内存不足无法分配1228804字节错误。 但是如果我使用define FLAG false,它工作正常,但是我得到的帧是错误的,如下所示。它们是三个连续的帧

我在手臂周围移动,从上面可以看到图像被夹在中间

有人能指出这种奇怪行为的原因吗?或者其他获得期望结果的替代方法。几天以来,我一直在努力解决这个问题。请询问是否需要进一步澄清

我正在使用OpenCV 2.4.8、适用于Windows 1.8.0版的Kinect SDK和Microsoft Visual Studio 2010

还有人能给我解释一下Mat::Mat中CopyData参数的作用吗。我已经看过了,但仍然不完全清楚。也许这就是为什么我不能解决上面的错误,因为它的工作不是很清楚

提前感谢。

首先,不要使用IplImages,请使用cv::Mat

这方面的等效代码为:

Mat img_borrowed = Mat( height, width, CV_8U4C, colorBuffer, colorLockedRect.Pitch );
请注意,这不会自行进行任何分配,它仍然是kinect的像素,因此您必须克隆它:

rgb[rgb_read++] = img_borrowed.clone();
这与将上面代码中的标志设置为“true”相同。深度复制数据

[编辑]也许跳过无用的第四频道也是一个好主意,因为它所需的内存更少,因此,您可以执行以下操作:

cvtColor( img_borrowed, rgb[rgb_read++], CV_BGRA2BGR); // will make a 'deep copy', too.
所以,-这是一个糟糕的问题:如果你不在数组中保存一个深度副本,你最终还是会得到乱码!图像,甚至可能由于kinect缓冲区的锁定/解锁而具有未定义的行为,如果您确实复制了它并且必须复制,您将需要大量内存


不太可能,如果你能在内存中保留3000*1024*786*4=9658368000字节,你就必须以这样或那样的方式减少它。

是的,没错,有时我甚至会一遍又一遍地复制同一幅图像。谢谢你的回复。我会检查你所说的方法是否有效。但是为什么我在一个数组中加载3000个图像的第一段代码工作得如此整洁呢?哦!实际上,我从未将存储的图像保存回磁盘进行验证。因为它没有给任何内存泄漏,我认为它是完美的。非常感谢你的提醒。是的,现在我知道怎么了。也许我需要减少我的数组限制或者考虑其他的选择。这是如此简单,即使在那时,它是杀害我很长一段时间了。我将接受答案你需要全尺寸的图像吗?你可以将它们的大小调整为可能的4倍,或者转换为bgr skip alpha,1个通道,小于全尺寸。我的笔记本电脑中的图像接近1200张。平行线也在书写。所以如果我使用循环队列,我可能会得到更多,但这还不够。正如我所说,我需要接近2700帧。我将尝试减小帧大小,或者使用替代帧而不是所有帧。基本上,我必须找到一个折衷方案。
cvtColor( img_borrowed, rgb[rgb_read++], CV_BGRA2BGR); // will make a 'deep copy', too.