OpenCV:cvCloneImage和内存泄漏

时间:2017-08-19 22:20:01

标签: opencv iplimage

我对OpenCV很新。我注意到以下代码有内存泄漏:

IplImage *img, *img_dest;
img = cvLoadImage("..\\..\\Sunset.jpg", CV_LOAD_IMAGE_COLOR);
while(1) // to make the mem leak obvious
{
    img_dest = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);
    img_dest = cvCloneImage(img);
    cvReleaseImage( &img_dest );
}
cvReleaseImage( &img );

如何释放未引用的数据呢?是否有一种简单的方法来制作一个IPL图像的干净副本(当然我们可以写一个循环来复制数据的每个元素......)。

1 个答案:

答案 0 :(得分:2)

针对您的内存泄漏问题:

cvCreateImage为图像分配了memoryA,并cvCloneImage分配了memoryB(并且克隆了代码中所述的img中存储的任何值)。 cvReleaseImage(&img_dest)只释放内存B,因此memoryA未被引用但未被释放。

对于您的IPL图像复制:

声明另一个内存并使用命令cvCopy,我没有看到使用它的任何困难,它是安全和有效的。

如果您希望声明IPL图像标头而不分配用于存储图像值的数据字节,请改用CreateImageHeader。我建议你花点时间掌握cvCreateImagecvCreateImageHeadercvCreateDatacvReleaseImagecvReleaseImageHeadercvReleaseImageDatacvCloneImage