我正在使用 cvBlobs 来跟踪视频中的一些对象。cvBlobs 使用具有 IplImage、cvMat、.. 等类型的旧 C 接口,而我使用的是使用 cv::Mat 的 C++ 接口。
所以我必须在这两种类型之间进行转换才能使用该库。这可行,但我无法释放内存。我的程序使用的内存不断增长。
这是我的代码,在底部您可以看到我尝试释放内存(编译器错误)。
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?