Mat to Eigen, eigen2cv and cv2eigen errors

asked 2019-03-28 10:31:25 -0500

HYPEREGO gravatar image

updated 2019-03-31 10:37:55 -0500

Dear guys,

I'm trying to solve SVD using the Eigen library, since I'm trying to solve one of the biggest error I've got so far in retrieving the fundamental matrix (here the link)

I'm using OpenCV 3.x and I can't compile OpenCV from sources with Eigen and/or LAPACK support, so I downloaded the Eigen library and putted under usr/local/include. No problem so far, I can see Eigen function and variables, so the linker and compiler are ok with that, I suppose. So, since I'm interesting in SVD and since I mostly use OpenCV for my stuff, I would like to write a function that directly compute the SVD for me. I've seen that there are a lot of possibilities to make cv::Mat working as Eigen::Matrix and vice-versa. What I would like is a function that do that:

int runEigenSVD(cv::InputArray _mat,
    cv::OutputArray _U, cv::OutputArray _S, cv::OutputArray _V,
    unsigned int QRPreconditioner,
    unsigned int computationOptions)

I'm not even able to compile since using different approaches I always get different errors. I obtain the input matrix with cv::Mat inputMat = _mat.getMat();, so suppose mat as my input matrix, always.

First try:

//OpenCV-> Eigen: it works!
 Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>>
            mat_Eigen(inputMat.ptr<double>(), mat.rows, mat.cols);

//Executing Eigen stuff, here SVD
 Eigen::JacobiSVD<Eigen::MatrixXd, Eigen::FullPivHouseholderQRPreconditioner> 
            svd(mat_Eigen, Eigen::ComputeThinU | Eigen::ComputeThinV);

//Eigen -> OpenCV
 int U_row = svd.matrixU().rows();
 int U_cols = svd.matrixU().cols();
 cv::Mat U_OpenCV(U_row, U_cols, CV_64FC1, svd.matrixU().data());

The errors I got are in the last line:

invalid conversion from ‘const void’ to ‘void’ [-fpermissive]

no matching function for call to ‘cv::Mat::Mat(int&, int&, int, const Scalar*)’

Using eigen2cv and cv2eigen

I got always error, using both function, even with simple code like this one:

cv::Mat_<float> a = Mat_<float>::ones(2,2);
Eigen::Matrix<float,Eigen::Dynamic,Eigen::Dynamic> b;
cv::cv2eigen(a,b);

The error I get is:

Invalid arguments ' Candidates are:

void eigen2cv(const ? &, cv::Mat &)

void eigen2cv(const ? &, cv::Matx<#0,int3 #1 0,int3 #2 0> &)'

Any suggestion? The documentation regarding it is like... nothing and it's incredible that nobody else have done it so far!!

EDIT ## I'm able to map from Mat to Eigen, but still find no way to map it back without the use of for-loop

edit retag flag offensive close merge delete

Comments

the 2nd one does not make sense at all, you're assigning a cv::Mat to a void function.

wouldn't you want something like cv2eigen there ?

berak gravatar imageberak ( 2019-03-28 10:34:57 -0500 )edit

Sorry, the example with eigen2cv was taken from the web, I'll edit the question immediately. Yeah, I would like to use something like cv2eigen because I just need to convert the input matrix from Mat to Eigen Matrix and viceversa with the result! I'm getting the same result as this. If I try the same code it give to me the same error but using the OpenCV documentation it seems to be ok the usage, isn't it?

HYPEREGO gravatar imageHYPEREGO ( 2019-03-28 10:56:11 -0500 )edit