矩阵(dis)分配

时间:2012-04-27 14:04:35

标签: c++ opencv memory-management shogun

我使用opencv c ++ API进行计算机视觉应用,并使用cv :: Mat结构管理矩阵。 Opencv使用ref计数将创建的对象释放为cv :: Mat。 我还使用libshogun来获得更具体的机器学习算法。 Shogun有自己的矩阵结构,称为SGMatrix。 我从cv :: Mat初始化SGMatrix,如下所示:

cv::Mat cvmat(100,100,CV_32FC1,cv::Scalar(0.0)); 
SGMatrix<float> sgmatrix((float*)cvmat.data, cvmat.rows, cvmat.cols);

我的问题是当我在shogun lib中使用另一个对象时:

CSimpleFeatures<float>* features = new CSimpleFeatures<float>(sgmatrix);

现在假设shogun拥有用features创建的矩阵,我在运行时遇到错误,当opencv尝试释放已由shogun发布的cvmat时。 我怎么处理这个?我不想克隆我的矩阵。

2 个答案:

答案 0 :(得分:3)

一旦SGMatrix和simplefeature对象被销毁,Shogun将解除分配矩阵。为避免使用

SGMatrix<float> sgmatrix((float*)cvmat.data, cvmat.rows, cvmat.cols, false);

这样你就必须处理内存释放!

答案 1 :(得分:2)

使用Shogun或new / malloc为OpenCV外部的矩阵内部分配内存。然后,使用其中一个构造函数创建矩阵,该构造函数将void*指针作为参数,指向矩阵数据(之前已分配)。这只会为您的数据创建一个opencv标头。

这样,opencv知道它不拥有矩阵内的数据,并且在释放cv::Mat对象时它不会尝试释放它。