1

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

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

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

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

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

4

2 回答 2

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);
于 2013-05-15T11:08:22.927 回答
2

关于内存管理问题,

如果你想保留 C 接口,你可以使用cv::Ptr<_Tp>类似于 c++11 的shared_ptr

cv::Ptr<IplImage> image = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1);

image由于析构函数,一旦指针被销毁,您的图像就会自动释放Ptr<IplImage>

template<> inline Ptr<IplImage>::delete_obj() {
    cvReleaseImage(&obj);
}

请注意,您可以使用具有内置内存管理的 OpenCV 的 C++ 接口(cv::Mat而不是作为实例):cv::IplImage

cv::Mat image(Size(640, 480), CV_8UC1);

关于内存使用优化

您可以使用cvCreateImageHeader,cvSetData并按照建议从缓冲区cvReleaseImageHeader中创建一个而不重新分配整体,但我真的不明白这一点,除非您在 OpenCV 之外进行图像处理。IplImagevoid*IplImage

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

于 2013-05-15T11:03:31.890 回答