我非常关心项目中的内存。由于内存泄漏,它之前已经崩溃了。 我正在考虑两种方法:
假设我有一个实时项目,因此,IplImages总是会被覆盖以生成新项目,并使用以下行进行声明/发布:
IplImage*image=cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1);
cvReleaseImage(&image);
优化内存使用的最佳方法是什么?
答案 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);
,cvCreateImageHeader
和cvSetData
从cvReleaseImageHeader
缓冲区创建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);