有关声明/释放IplImages的两种情况

时间:2013-05-15 10:52:23

标签: c++ visual-studio-2010 opencv

我非常关心项目中的内存。由于内存泄漏,它之前已经崩溃了。 我正在考虑两种方法:

  • 在主项目部分中仅声明一次不同的IplImages。
  • 我需要声明IplImage时立即声明,并在我不再需要它时释放它。

假设我有一个实时项目,因此,IplImages总是会被覆盖以生成新项目,并使用以下行进行声明/发布:

IplImage*image=cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1);
cvReleaseImage(&image);

优化内存使用的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

关于内存管理问题,

如果您想继续使用C接口,可以使用类似于c ++ 11 cv::Ptr<_Tp>的{​​{1}}:

shared_ptr

由于cv::Ptr<IplImage> image = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1); 析构函数导致image指针被销毁,您的图像将自动释放:

Ptr<IplImage>

请注意,您可以使用OpenCV的C ++接口(template<> inline Ptr<IplImage>::delete_obj() { cvReleaseImage(&obj); } 而不是cv::Mat作为实例),该接口具有内置内存管理功能:

cv::IplImage

关于内存使用优化

您可以根据建议使用cv::Mat image(Size(640, 480), CV_8UC1); cvCreateImageHeadercvSetDatacvReleaseImageHeader缓冲区创建IplImage,而无需重新分配整个void*但是,除非你在OpenCV之外进行图像处理,否则我没有看到这一点。

使用OpenCV,您不必在每个处理步骤中创建新的IplImage 。对于任何就地算法,您可以使用相同的IplImage作为源目标,并且您始终可以为任何其他算法重复使用相同的临时缓冲区。

答案 1 :(得分:2)

您还可以使用一个IplImage指针,然后使用cvCreateImageHeader填充标题,并使用cvSetData每次从缓冲区填充图像数据。最后,您可以使用cvReleaseImageHeader来释放它。

IplImage *m_img_show = NULL;
CvSize cv_img_size = cvSize(m_width,m_height);
m_img_show = cvCreateImageHeader(cv_img_size, IPL_DEPTH_8U,3);

每次都使用此方法填充m_pBuffer中的图像。

cvSetData(m_img_show, m_pBuffer, m_width*3);

最后释放标题和图像数据缓冲区

cvReleaseImageHeader(&m_img_show);