1

我将 opencv c++ API 用于计算机视觉应用程序,并使用 cv::Mat 结构管理矩阵。Opencv 使用引用计数将创建的对象释放为 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 尝试释放cvmat已由 shogun 释放的矩阵时,我得到一个错误。我该如何处理?我不想克隆我的矩阵。

4

2 回答 2

3

一旦 SGMatrix 和 simplefeature 对象被销毁,Shogun 将取消分配矩阵。为了避免这种使用

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

这样你就必须照顾内存释放!

于 2012-12-06T16:33:58.747 回答
2

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

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

于 2012-04-27T14:33:39.937 回答