5

我正在使用 OpenCV 构建图像处理应用程序。我也在使用 Armadillo 库,因为它有一些非常简洁的矩阵相关函数。问题是,为了在 cv::Mat 上使用 Armadillo 函数,我需要经常从 cv::Mat 转换为 arma::Mat 。为此,我使用这样的函数将 cv::Mat 转换为 arma::Mat

arma::Mat cvMat2armaMat(cv::Mat M)
{
    copy cv::Mat data to a arma::Mat
    return arma::Mat
}

有没有更有效的方法来做到这一点?

4

1 回答 1

2

为了避免或减少复制,您可以通过.memptr()成员函数访问 Armadillo 矩阵使用的内存。例如:

mat X(5,6);
double* mem = X.memptr();

使用上述方法时要小心,因为不允许您自己释放内存(犰狳仍将管理内存)。

或者,您可以直接从现有内存构造一个犰狳矩阵。例如:

double* data = new double[4*5];
// ... fill data ...
mat X(data, 4, 5, false);  // 'false' indicates that no copying is to be done; see docs

在这种情况下,您将负责手动管理内存。

还要记住,犰狳以列优先顺序存储和访问矩阵,即。首先存储第 0 列,然后存储第 1 列、第 2 列等。这与 MATLAB、LAPACK 和 BLAS 使用的相同。

于 2013-06-21T12:59:47.760 回答