ero*_*gol -1 c++ opencv memory-leaks memory-management
我在代码中的几个地方执行以下操作;
cv::Mat cv_proc_image = ...
IplImage ipl_img = cv_proc_image;
cvSmooth(&ipl_img, &ipl_img, smooth_type, smooth_param1);
cv_proc_image = cv::cvarrToMat(&ipl_img);
Run Code Online (Sandbox Code Playgroud)
在观察到此操作的变化后,我观察到内存膨胀.你认为,我应该在最后一次分配后释放IplImages分配的内存吗?
您不应该首先使用旧的C语法.您应该使用C++语法.另请注意cvSmooth:
该功能现已过时.使用GaussianBlur(),blur(),medianBlur()或bilateralFilter().
UPDATE
当你这样做时,IplImage ipl_img = mat_img;你只是创建一个新的标题,没有数据的副本.所以这不会耗尽你的记忆力.让我用一个小例子来展示它:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
// Your (green) mat
Mat mat_img(10, 10, CV_8UC3, Scalar(0,255,0));
// To IplImage
IplImage ipl_img = mat_img;
Run Code Online (Sandbox Code Playgroud)
这两个mat_img和ipl_img是平等的.没有涉及复制.
// It's created only a new header, on the same data
// In fact, changing ipl_img changes also mat_img
cvSet2D(&ipl_img, 1, 2, Scalar(255,0,0));
Run Code Online (Sandbox Code Playgroud)
两张图片都改为:
// Same here, changing ipl_img changes also mat_img
cvSmooth(&ipl_img, &ipl_img);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
即使在平滑之后它们也是平等的:
结论
所以回答你原来的问题:不,你不需要发布IplImage,因为不涉及副本.您只是创建新标头,但指向相同的数据.你的内存泄漏在其他地方.
你甚至不需要使用cvarrToMat,因为对它的改变IplImage是相同的Mat.