Mat to Eigen, eigen2cv and cv2eigen errors [closed]
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!!
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 ?
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?