我对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图像的干净副本(当然我们可以写一个循环来复制数据的每个元素......)。
答案 0 :(得分:2)
针对您的内存泄漏问题:
cvCreateImage
为图像分配了memoryA,并cvCloneImage
分配了memoryB(并且克隆了代码中所述的img
中存储的任何值)。 cvReleaseImage(&img_dest)
只释放内存B,因此memoryA未被引用但未被释放。
对于您的IPL图像复制:
声明另一个内存并使用命令cvCopy
,我没有看到使用它的任何困难,它是安全和有效的。
如果您希望声明IPL图像标头而不分配用于存储图像值的数据字节,请改用CreateImageHeader
。我建议你花点时间掌握cvCreateImage
,cvCreateImageHeader
,cvCreateData
,cvReleaseImage
,cvReleaseImageHeader
,cvReleaseImageData
和cvCloneImage