转换成Mat后我是否需要释放IplImage?

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分配的内存吗?

Mik*_*iki 6

您不应该首先使用旧的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_imgipl_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.