gpt4 book ai didi

c++ - 如何从 opencv cv::Mat 或行优先数组初始化特征矩阵?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:11:03 25 4
gpt4 key购买 nike

我发现 Eigen 矩阵默认是列优先的,这类似于 MATLAB,但是如何从 cv::Mat 初始化 Eigen::MatrixXd?下面的代码是我的测试。但是它们都无法编译成功。有人可以给我一些建议吗?或其他一些链接?谢谢。

    cv::Mat A_M=cv::Mat(rows, cols, CV_64FC1);
double *A=(double *)A_M.data();
typedef Map<MatrixXd> MapMat;
MapMat A_eigen(A,m,n);

Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor> A_eigen;
Eigen::Map<Matrix<double,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor> >(A,m,n) = A_eigen;

更新:

    double *A=(double *)A_M.data();//m*n
double *B=(double *)B_M.data();//n*p
double *C=(double *)C_M.data();//m*p
//regular Eigen Matrix
Eigen::MatrixXd A_eigenMat;
Eigen::MatrixXd B_eigenMat;
Eigen::MatrixXd C_eigenMat;
Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > A_mappedMat (A, m, n);
Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > B_mappedMat (B, n, p);
Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > C_mappedMat (C, m, p);
// Eigen handles the conversion from row major to column major
A_eigenMat = A_mappedMat;
B_eigenMat = B_mappedMat;
C_eigenMat = C_mappedMat;

// multiplication
C_eigenMat=A_eigenMat*B_eigenMat;

然后,当我输出 M_C 时,它的结果是错误的。 C_eigenMat 似乎没有将数据复制到 M_C.data 中。

最佳答案

样本来自 Conversion between OpenCV and Eigen :

cv::Mat_<float> a = Mat_<float>::ones(2,2);
Eigen::Matrix<float,Dynamic,Dynamic> b;
cv2eigen(a,b);

已经回答on SO :

//allocate memory for a 4x4 float matrix
cv::Mat cvT(4,4,CV_32FC1);

//directly use the buffer allocated by OpenCV
Eigen::Map<Matrix4f> eigenT( cvT.data() );

还有一个SO post

关于c++ - 如何从 opencv cv::Mat 或行优先数组初始化特征矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19115488/

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