将OpenCV的cv::Mat转换为Eigen

Convert the cv::Mat of OpenCV to Eigen

这个 post 向我们展示了如何在不复制数据的情况下将 cv::Mat 映射到特征矩阵,它工作正常,但有一件事我不明白。

Mat A(20, 20, CV_32FC1);
cv::randn(A, 0.0f, 1.0f); // random data

// Map the OpenCV matrix with Eigen:
Eigen::Map<Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> A_Eigen(A.ptr<float>(), A.rows, A.cols);

问题是,Mat A 没有告诉 A_Eigen 每行应该占用多少字节,据我所知,OpenCV 的 cv::Mat 可能会也可能不会在每一行上填充,我是否需要告诉 Eigen 每行有多少字节(如何?)?或者我可以安全地省略它?

Ps: 我正在使用 Eigen 3

不使用 A.cols,而是使用 A.step(或 A.step[0]A.step[1]?)。如果OpenCV矩阵不是continuous,那么m.step != m.cols*m.elemSize()。您只需要忽略任何其他列,例如A_Eigen.block<0,0>(A.rows, A.cols).