美文网首页一起折腾计算机视觉库
OpenCV矩阵与Eigen矩阵相互转换

OpenCV矩阵与Eigen矩阵相互转换

作者: He_Yu | 来源:发表于2019-08-08 08:16 被阅读0次

一、OpenCV与Eigen的交互

OpenCV矩阵结构为:cv::Mat,或者cv::Mat_等,当需要与Eigen的矩阵结构相互转换时主要使用函数:

cv::eigen2cvcv::cv2eigen,需要头文件:
#include<opencv2/core/eigen.hpp>

二、cv::cv2eigen

#include <Eigen/Dense>
#include <iostream>
#include <opencv2/core/eigen.hpp>
#include <opencv2/opencv.hpp>
 
using namespace std;
using namespace cv;
using namespace Eigen;
 
void main()
{
    Mat img = imread("example.jpg",CV_LOAD_IMAGE_GRAYSCALE);
    int row = img.rows;
    int col = img.cols;
    MatrixXd m(row, col);
    cv2eigen(img,m);
    return;
}

三、cv::eigen2cv

#include <Eigen/Dense>
#include <iostream>
#include <opencv2/core/eigen.hpp>
#include <opencv2/opencv.hpp>
 
using namespace std;
using namespace cv;
using namespace Eigen;
 
void main()
{
    Mat img;
    Matrix<int,100,100> m ;
    m.fill(255);
    eigen2cv(m, img);
    return;
}

四、Example——平移和旋转向量转为欧式变换矩阵(4X4)

// cvMat2Eigen
Eigen::Isometry3d cvMat2Eigen( cv::Mat& rvec, cv::Mat& tvec )
{
    cv::Mat R;
    cv::Rodrigues( rvec, R );
    Eigen::Matrix3d r;
    cv::cv2eigen(R, r);
  
    // 将平移向量和旋转矩阵转换成变换矩阵
    Eigen::Isometry3d T = Eigen::Isometry3d::Identity();

    Eigen::AngleAxisd angle(r);
    Eigen::Translation<double,3> trans(tvec.at<double>(0,0), tvec.at<double>(0,1), tvec.at<double>(0,2));
    T = angle;
    T(0,3) = tvec.at<double>(0,0); 
    T(1,3) = tvec.at<double>(0,1); 
    T(2,3) = tvec.at<double>(0,2);
    return T;
}

注意:

包含头文件(顺序不能错!!!先包含eigen相关库,再包含opencv库!)

备注:经笔者实验,该转换存在矩阵精度损失的问题,具体是由于什么原因造成的,待查更新。

更详细的相关内容参看这篇博客:eigen与opencv矩阵转换,eigen与matlab函数比照

相关文章

网友评论

    本文标题:OpenCV矩阵与Eigen矩阵相互转换

    本文链接:https://www.haomeiwen.com/subject/noqtjctx.html