【发布时间】:2014-12-17 13:39:05
【问题描述】:
我的目标是以 30 fps 从 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);
}
以上代码完美执行。
但一个问题是,我用于使用 Kinect 捕获图像的代码在 IplImage 中捕获图像。因此我需要在使用之前将图像转换为cv::Mat 格式。我使用以下命令对其进行转换:
IplImage* color = cvCreateImageHeader(cvSize(COLOR_WIDTH, COLOR_HEIGHT), IPL_DEPTH_8U, 4);
cvSetData(color, colorBuffer, colorLockedRect.Pitch); // colorBuffer and colorLockedRect.Pitch is something that Kinect uses. Not related to OpenCv
rgb[rgb_read++] = Mat(color, FLAG);
现在这是我的问题。每当我设置#define FLAG true 时,它都会导致内存泄漏并给我OpenCv Error: Insufficient memory (failed to allocate 1228804 bytes) 错误。
但是如果我使用#define FLAG false 它可以正常工作,但是我得到的帧是错误的,如下所示。它们是三个连续的帧。
我绕着我的手臂移动,从上面可以看到图像被夹在中间。
有人可以指出这种奇怪行为的原因或获得所需结果的任何其他替代方式。几天以来,我一直在为此苦苦挣扎。请询问是否需要进一步澄清。
我正在使用 OpenCV 2.4.8、Kinect SDK for Windows version-1.8.0 和 Microsoft Visual Studio 2010。
也有人可以向我解释CopyData 参数在Mat::Mat 中的作用。我已经通过this link,但仍然不完全清楚。也许这就是为什么我无法解决上述错误,因为它的工作不是很清楚。
提前致谢。
【问题讨论】:
标签: c++ arrays opencv memory-leaks kinect-sdk