Search code examples
c++opencveigen

OpenCV CV::Mat and Eigen::Matrix


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?


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