OpenCV CV::Mat and Eigen::Matrix

c++, eigen, opencv

Solution

You should consider using Eigen::Map to wrap OpenCV matrices in order to be used directly by the Eigen SDK. This allows you to apply almost all functionalities implemented in Eigen on matrix allocated by OpenCV

In particular you simply instantiate an Eigen::Map providing the pointer to the cv::Mat buffer:

//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() ); 

for more information on Eigen::Map take a look at Eigen Tutorial: Map Class

Problem

Is there a reversible way to convert an OpenCV `cv::Mat` object to an `Eigen::Matrix`? e.g., Some way of doing: ``` cv::Mat cvMat; Eigen::Matrix eigMat; camera->retrieve(cvMat); // magic to convert cvMat to eigMat // work on eigMat // convert eigMat back to cvMat imshow("Image", cvMat); ``` I've tried using `cv2eigen` and `eigen2cv`, but the resulting `cvMat` is completely mangled and I'm not exactly sure why. The dimensions are correct, but the graphics are totally trashed, so possibly a bytes-per-pixel or datasize issue?

Original source