6

我发现 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 中。

4

2 回答 2

5

OpenCV 和 Eigen 之间的转换示例:

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

它已经在 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 帖子中

于 2013-10-01T12:11:48.947 回答
5

MikroDel 的答案使用 OpenCV 的功能,但 cv2eigen 包含数据的副本,如果您只想映射数据指针,这不是最佳选择。使用Eigen::Map<>通常是更好的选择。我修改了你的代码,这个例子有效:

int main(int argc, char *argv[]) {
  int rows = 4, cols = 3;
  cv::Mat A_M=cv::Mat::eye(rows, cols, CV_64FC1);
  A_M.at<double>(0,2) = 10;
  double *A=(double *)A_M.data;
  //regular Eigen Matrix
  Eigen::MatrixXd eigenMat;

  Eigen::Map<Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor> > mappedMat (A,rows, cols);
  // Eigen handles the conversion from row major to column major
  eigenMat = mappedMat;   

  std::cout << A_M << std::endl;
  std::cout << eigenMat << std::endl;
  return 0;
}
于 2013-10-02T22:03:03.540 回答