I found that Eigen's Matrix is default column-major, which is like MATLAB, but how do I initialize an Eigen::MatrixXd from an cv::Mat? The following code is my test. But none of them could be compiled successfully. Could someone give me some advice, please? or some other links? Thanks.
cv::Mat A_M=cv::Mat(rows, cols, CV_64FC1);
double *A=(double *)A_M.data();
typedef Map MapMat;
MapMat A_eigen(A,m,n);
Eigen::Matrix A_eigen;
Eigen::Map >(A,m,n) = A_eigen;
Updated:
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<:matrix eigen::dynamic eigen::rowmajor> > A_mappedMat (A, m, n);
Eigen::Map<:matrix eigen::dynamic eigen::rowmajor> > B_mappedMat (B, n, p);
Eigen::Map<:matrix 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;
Then, when I output the M_C, its result is wrong. It seems the C_eigenMat didn't copy the data into M_C.data.
解决方案cv::Mat_ a = Mat_::ones(2,2);
Eigen::Matrix b;
cv2eigen(a,b);
It is already answered 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 eigenT( cvT.data() );
and in one more SO post