gpt4 book ai didi

c++ - 从 cv::Mat 初始化的 IplImage 的内存释放

转载 作者:太空宇宙 更新时间:2023-11-03 22:34:08 24 4
gpt4 key购买 nike

我正在使用 cvBlobs 来跟踪视频中的某些对象。 cvBlobs 使用较旧的 C 接口(interface)和 IplImage、cvMat 等类型,而我使用的是使用 cv::Mat 的 C++ 接口(interface)。

所以我必须在这两种类型之间进行转换才能使用该库。这有效,但我无法释放内存。我的程序使用的内存不断增长。

这是我的代码,在底部你可以看到我试图释放内存(编译器错误)。

void Tracker::LabelConnectedComponents(Mat& Frame, Mat& Foreground)
{
// Convert to old format, this is the method used in the opencv cheatsheet
IplImage IplFrame = Frame;
IplImage IplForeground = Foreground;

IplImage *LabelImg = cvCreateImage(cvGetSize(&IplFrame), IPL_DEPTH_LABEL, 1);

// Make blobs (IplForeground is the segmented frame, 1 is foreground, 0 background)
unsigned int result = cvLabel(&IplForeground, LabelImg, Blobs);

// Remove small blobs
cvFilterByArea(Blobs, 500, 1000000);

// Draw bounding box
cvRenderBlobs(LabelImg, Blobs, &IplFrame, &IplFrame, CV_BLOB_RENDER_BOUNDING_BOX | CV_BLOB_RENDER_CENTROID);

// Convert back to c++ format
Frame = cvarrToMat(&IplFrame);

// Here are the problems
cvReleaseImage(&IplFrame); // error
cvReleaseImage(&IplForeground); // error
cvReleaseImage(&LabelImg); // ok
}

cvReleaseImage 有一个 IplImage** 类型作为参数,这是编译器错误:

tracker.cpp|35 col 33 error| cannot convert ‘IplImage* {aka _IplImage*}’ to ‘IplImage** {aka _IplImage**}’ for argument ‘1’ to ‘void cvReleaseImage(IplImage**)’

我知道 &IplFrame 不是正确的论点,但 &&IplFrame 不起作用。我怎样才能释放这 2 个 IplImages?

最佳答案

问题是您在这里创建了对象的拷贝:

IplImage IplFrame = Frame;
IplImage IplForeground = Foreground;

因此,这些调用:

cvReleaseImage(IplFrame); 
cvReleaseImage(IplForeground);

即使可以编译也不会发布原始图像。如果您已经在删除对象(即更改它们),为什么将它们作为引用而不是指针发送给方法?我有点困惑,因为您似乎在做这样的事情:

Mat frame = ...
Mat fg = ...
LabelConnectedComponents(frame, fg); // function releases the frame/fg memory
// at this point you are left with invalid frame/fg

我查看了文档,它说 Mat::operator IplImage() doesn't copy data,这意味着 IplFrame 不拥有内存,所以释放是不正确的

我认为这取决于 Mat 实例是如何创建的 - 如果它是从 IplImage* 创建的,并且 copyData 设置为 false ,那么您需要释放原始的 IplImage 实例。如果它是在 copyData 设置为 true 的情况下创建的,则 Mat 实例会自动处理它(除非您明确地使用 Mat::发布)

关于c++ - 从 cv::Mat 初始化的 IplImage 的内存释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12635978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com