2015-08-24 172 views
0

这个post告诉我们如何将cv::Mat映射到Eigen矩阵而不复制数据,它工作正常,但有一件事我不明白。将OpenCV的cv :: Mat转换为Eigen

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:我用的而不是使用A.cols本征3

+1

我可能会使用OpenCV给出的[转换函数](https://github.com/Itseez/opencv/blob/master/modules/core/include/opencv2/core/eigen.hpp)(第二个答案链接的问题)。 [OpenCV文档](http://docs.opencv.org/master/d0/daf/group__core__eigen.html#ga28d4c291bb74c3b915e2fd62f03906b1&gsc.tab=0) – Miki

+0

@Miki谢谢,opencv解决方案将分配新缓冲区并复制数据(动态矩阵),但我想重用现有的缓冲区,当训练大量数据时,减少内存的使用是至关重要的,否则它可能会抛出bad_alloc异常 – StereoMatching

回答

1

,使用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)