目录

1 opencv的Mat与Eigen的Matrix相互转换

1.1 Eigen 转 cv::Mat

1.2 cv::Mat 转 Eigen

1.3 float 与 double 互转

2 SE(3):把cv的旋转矩阵转换为Eigen中旋转矩阵的赋值

3 ORB-SLAM3 各种类型矩阵变换函数:


​​​​​​​

1 opencv的Mat与Eigen的Matrix相互转换

首先包含这几个头文件,据说Eigen相关的要放在前面。

#include <Eigen/Core>
#include <Eigen/Dense>
#include <opencv2/core/eigen.hpp>
#include <opencv2/opencv.hpp>

1.1 Eigen 转 cv::Mat

关键函数:cv::eigen2cv

Eigen::Matrix<float, 2, 3> matrix_23f;
matrix_23f << 1, 2, 3, 4, 5, 6;
cv::Mat mat_23f;
cv::eigen2cv(matrix_23f, mat_23f);

1.2 cv::Mat 转 Eigen

关键函数:cv::cv2eigen

cv::Mat mat_23f(2, 3, CV_32F); // 也可以不加括号后面的,直接定义 cv::Mat mat_23f;
mat_23f = (cv::Mat_<float>(2, 3) << 1, 2, 3, 4, 5, 6);
Eigen::Matrix<float, 2, 3> matrix_23f;
cv::cv2eigen(mat_23f, matrix_23f);

1.3 float 与 double 互转

在Eigen和opencv中,矩阵的精度是不能隐式转换的,必须显式转换
eigen:
关键函数:matrix_23f.cast<double>()

Eigen::Matrix<float, 2, 3> matrix_23f;
matrix_23f << 1, 2, 3, 4, 5, 6;
Eigen::Matrix<double, 2, 3> matrix_23d = matrix_23f.cast<double>();

opencv:
关键函数:mat_23f.convertTo(mat_23d, CV_64F)

cv::Mat mat_23f(2, 3, CV_32F);
mat_23f = (cv::Mat_<float>(2, 3) << 1, 2, 3, 4, 5, 6);
cv::Mat mat_23d(2, 3, CV_64F);
mat_23f.convertTo(mat_23d, CV_64F);

2 SE(3):把cv的旋转矩阵转换为Eigen中旋转矩阵的赋值

今天处理ORBslam的位姿进行点云拼接时碰到了问题
ORBslam获得的位姿旋转矩阵是一个在cv::Mat下定义的4×4的矩阵,需要转换到Eigen下,因为想要使用相应的点云转换函数
因此使用下面的函数进行转换

//把mat类型的旋转矩阵SE(3)转换为Eigen下的SE(3)
Eigen::Isometry3d Mat2Isometry3d(cv::Mat R)
{Eigen::Isometry3d T;{  cout<<"Convert Failed!"<<endl;return Eigen::Isometry3d::Identity();}for(int i=0;i<4;i++)for(int j=0;j<4;j++){T(i,j)=R.at<float>(i,j);  }return T;
}

需要注意的是在这一行T(i,j)=R.at<float>(i,j);

如果把float换成double,就会出现T的值非常的乱,与矩阵R没有任何关系,因此这儿的格式一定要注意

3 ORB-SLAM3 各种类型矩阵变换函数:

Converter.h

#ifndef CONVERTER_H
#define CONVERTER_H#include<opencv2/core/core.hpp>#include<Eigen/Dense>
#include"Thirdparty/g2o/g2o/types/types_six_dof_expmap.h"
#include"Thirdparty/g2o/g2o/types/types_seven_dof_expmap.h"namespace ORB_SLAM3
{class Converter
{
public:static std::vector<cv::Mat> toDescriptorVector(const cv::Mat &Descriptors);static g2o::SE3Quat toSE3Quat(const cv::Mat &cvT);static g2o::SE3Quat toSE3Quat(const g2o::Sim3 &gSim3);static cv::Mat toCvMat(const g2o::SE3Quat &SE3);static cv::Mat toCvMat(const g2o::Sim3 &Sim3);static cv::Mat toCvMat(const Eigen::Matrix<double,4,4> &m);static cv::Mat toCvMat(const Eigen::Matrix3d &m);static cv::Mat toCvMat(const Eigen::Matrix<double,3,1> &m);static cv::Mat toCvMat(const Eigen::MatrixXd &m);static cv::Mat toCvSE3(const Eigen::Matrix<double,3,3> &R, const Eigen::Matrix<double,3,1> &t);static cv::Mat tocvSkewMatrix(const cv::Mat &v);static Eigen::Matrix<double,3,1> toVector3d(const cv::Mat &cvVector);static Eigen::Matrix<double,3,1> toVector3d(const cv::Point3f &cvPoint);static Eigen::Matrix<double,3,3> toMatrix3d(const cv::Mat &cvMat3);static Eigen::Matrix<double,4,4> toMatrix4d(const cv::Mat &cvMat4);//john updatestatic Eigen::Matrix<float,3,3> toMatrix3f(const cv::Mat &cvMat3);static Eigen::Matrix<float,4,4> toMatrix4f(const cv::Mat &cvMat4);static std::vector<float> toQuaternion(const cv::Mat &M);static bool isRotationMatrix(const cv::Mat &R);static std::vector<float> toEuler(const cv::Mat &R);};}// namespace ORB_SLAM#endif // CONVERTER_H

Converter.cpp

#include "Converter.h"namespace ORB_SLAM3
{std::vector<cv::Mat> Converter::toDescriptorVector(const cv::Mat &Descriptors)
{std::vector<cv::Mat> vDesc;vDesc.reserve(Descriptors.rows);for (int j=0;j<Descriptors.rows;j++)vDesc.push_back(Descriptors.row(j));return vDesc;
}g2o::SE3Quat Converter::toSE3Quat(const cv::Mat &cvT)
{Eigen::Matrix<double,3,3> R;R << cvT.at<float>(0,0), cvT.at<float>(0,1), cvT.at<float>(0,2),cvT.at<float>(1,0), cvT.at<float>(1,1), cvT.at<float>(1,2),cvT.at<float>(2,0), cvT.at<float>(2,1), cvT.at<float>(2,2);Eigen::Matrix<double,3,1> t(cvT.at<float>(0,3), cvT.at<float>(1,3), cvT.at<float>(2,3));return g2o::SE3Quat(R,t);
}cv::Mat Converter::toCvMat(const g2o::SE3Quat &SE3)
{Eigen::Matrix<double,4,4> eigMat = SE3.to_homogeneous_matrix();return toCvMat(eigMat);
}cv::Mat Converter::toCvMat(const g2o::Sim3 &Sim3)
{Eigen::Matrix3d eigR = Sim3.rotation().toRotationMatrix();Eigen::Vector3d eigt = Sim3.translation();double s = Sim3.scale();return toCvSE3(s*eigR,eigt);
}cv::Mat Converter::toCvMat(const Eigen::Matrix<double,4,4> &m)
{cv::Mat cvMat(4,4,CV_32F);for(int i=0;i<4;i++)for(int j=0; j<4; j++)cvMat.at<float>(i,j)=m(i,j);return cvMat.clone();
}cv::Mat Converter::toCvMat(const Eigen::Matrix3d &m)
{cv::Mat cvMat(3,3,CV_32F);for(int i=0;i<3;i++)for(int j=0; j<3; j++)cvMat.at<float>(i,j)=m(i,j);return cvMat.clone();
}cv::Mat Converter::toCvMat(const Eigen::MatrixXd &m)
{cv::Mat cvMat(m.rows(),m.cols(),CV_32F);for(int i=0;i<m.rows();i++)for(int j=0; j<m.cols(); j++)cvMat.at<float>(i,j)=m(i,j);return cvMat.clone();
}cv::Mat Converter::toCvMat(const Eigen::Matrix<double,3,1> &m)
{cv::Mat cvMat(3,1,CV_32F);for(int i=0;i<3;i++)cvMat.at<float>(i)=m(i);return cvMat.clone();
}cv::Mat Converter::toCvSE3(const Eigen::Matrix<double,3,3> &R, const Eigen::Matrix<double,3,1> &t)
{cv::Mat cvMat = cv::Mat::eye(4,4,CV_32F);for(int i=0;i<3;i++){for(int j=0;j<3;j++){cvMat.at<float>(i,j)=R(i,j);}}for(int i=0;i<3;i++){cvMat.at<float>(i,3)=t(i);}return cvMat.clone();
}Eigen::Matrix<double,3,1> Converter::toVector3d(const cv::Mat &cvVector)
{Eigen::Matrix<double,3,1> v;v << cvVector.at<float>(0), cvVector.at<float>(1), cvVector.at<float>(2);return v;
}Eigen::Matrix<double,3,1> Converter::toVector3d(const cv::Point3f &cvPoint)
{Eigen::Matrix<double,3,1> v;v << cvPoint.x, cvPoint.y, cvPoint.z;return v;
}Eigen::Matrix<double,3,3> Converter::toMatrix3d(const cv::Mat &cvMat3)
{Eigen::Matrix<double,3,3> M;M << cvMat3.at<float>(0,0), cvMat3.at<float>(0,1), cvMat3.at<float>(0,2),cvMat3.at<float>(1,0), cvMat3.at<float>(1,1), cvMat3.at<float>(1,2),cvMat3.at<float>(2,0), cvMat3.at<float>(2,1), cvMat3.at<float>(2,2);return M;
}//john update 2021-03-31
Eigen::Matrix<float,3,3> Converter::toMatrix3f(const cv::Mat &cvMat3)
{Eigen::Matrix<float,3,3> M;M << cvMat3.at<float>(0,0), cvMat3.at<float>(0,1), cvMat3.at<float>(0,2),cvMat3.at<float>(1,0), cvMat3.at<float>(1,1), cvMat3.at<float>(1,2),cvMat3.at<float>(2,0), cvMat3.at<float>(2,1), cvMat3.at<float>(2,2);return M;
}Eigen::Matrix<double,4,4> Converter::toMatrix4d(const cv::Mat &cvMat4)
{Eigen::Matrix<double,4,4> M;M << cvMat4.at<float>(0,0), cvMat4.at<float>(0,1), cvMat4.at<float>(0,2), cvMat4.at<float>(0,3),cvMat4.at<float>(1,0), cvMat4.at<float>(1,1), cvMat4.at<float>(1,2), cvMat4.at<float>(1,3),cvMat4.at<float>(2,0), cvMat4.at<float>(2,1), cvMat4.at<float>(2,2), cvMat4.at<float>(2,3),cvMat4.at<float>(3,0), cvMat4.at<float>(3,1), cvMat4.at<float>(3,2), cvMat4.at<float>(3,3);return M;
}//john update 2021-03-31
Eigen::Matrix<float,4,4> Converter::toMatrix4f(const cv::Mat &cvMat4)
{Eigen::Matrix<float,4,4> M;M << cvMat4.at<float>(0,0), cvMat4.at<float>(0,1), cvMat4.at<float>(0,2), cvMat4.at<float>(0,3),cvMat4.at<float>(1,0), cvMat4.at<float>(1,1), cvMat4.at<float>(1,2), cvMat4.at<float>(1,3),cvMat4.at<float>(2,0), cvMat4.at<float>(2,1), cvMat4.at<float>(2,2), cvMat4.at<float>(2,3),cvMat4.at<float>(3,0), cvMat4.at<float>(3,1), cvMat4.at<float>(3,2), cvMat4.at<float>(3,3);return M;
}std::vector<float> Converter::toQuaternion(const cv::Mat &M)
{Eigen::Matrix<double,3,3> eigMat = toMatrix3d(M);Eigen::Quaterniond q(eigMat);std::vector<float> v(4);v[0] = q.x();v[1] = q.y();v[2] = q.z();v[3] = q.w();return v;
}cv::Mat Converter::tocvSkewMatrix(const cv::Mat &v)
{return (cv::Mat_<float>(3,3) <<             0, -v.at<float>(2), v.at<float>(1),v.at<float>(2),               0,-v.at<float>(0),-v.at<float>(1),  v.at<float>(0),              0);
}bool Converter::isRotationMatrix(const cv::Mat &R)
{cv::Mat Rt;cv::transpose(R, Rt);cv::Mat shouldBeIdentity = Rt * R;cv::Mat I = cv::Mat::eye(3,3, shouldBeIdentity.type());return  cv::norm(I, shouldBeIdentity) < 1e-6;}std::vector<float> Converter::toEuler(const cv::Mat &R)
{assert(isRotationMatrix(R));float sy = sqrt(R.at<float>(0,0) * R.at<float>(0,0) +  R.at<float>(1,0) * R.at<float>(1,0) );bool singular = sy < 1e-6; // Iffloat x, y, z;if (!singular){x = atan2(R.at<float>(2,1) , R.at<float>(2,2));y = atan2(-R.at<float>(2,0), sy);z = atan2(R.at<float>(1,0), R.at<float>(0,0));}else{x = atan2(-R.at<float>(1,2), R.at<float>(1,1));y = atan2(-R.at<float>(2,0), sy);z = 0;}std::vector<float> v_euler(3);v_euler[0] = x;v_euler[1] = y;v_euler[2] = z;return v_euler;
}} //namespace ORB_SLAM

参考:
https://blog.csdn.net/weixin_42587961/article/details/94446580

https://blog.csdn.net/jqw11/article/details/97777524

https://humfrey.blog.csdn.net/article/details/107387479

https://blog.csdn.net/qq_34122731/article/details/91467938

opencv的Mat与Eigen的Matrix相互转换相关推荐

  1. 计算机视觉之OpenCV教程 ---Mat类基础(一)

    机器视觉之OpenCV教程图像容器Mat类基础一(一) 零.OpenCV概述 基本上在机器识别的领域 ,都有OpenCV的身影 . OpenCV中基本上包含了所有的机器视觉所用到的算法 , 即使没有也 ...

  2. opencv的mat赋值_OpenCV Mat 类型定义和赋值

    1.一般的Mat定义方法:cv::Mat M(height,width,),例: cv::Mat M(480,640,CV_8UC3); 表示定义了一个480行640列的矩阵,矩阵的每个单元的由三个( ...

  3. OpenCV的Mat类型以及基本函数使用

    OpenCV的Mat类型以及基本函数使用 Mat和IplImage的区别 Mat和IplImage的主要区别 在OpenCV中IplImage是表示一个图像的结构体,也是从OpenCV1.0到目前最为 ...

  4. opencv中mat详细解析

    ##1.起源 OpenCV作为强大的计算机视觉开源库,很大程度上参考了MatLab的实现细节和风格,比如说,在OpenCV2.x 版本以后,越来越多的函数实现了MatLab具有的功能,甚至干脆连函数名 ...

  5. 【OpenCV】Mat的初始化

    [OpenCV]Mat的初始化和非初始化设值 一.初始化设值 例一 例二 二.非初始化设值 例一 例二 例三 例四 [参考链接] https://docs.opencv.org/4.0.1/d6/d6 ...

  6. Opencv的Mat内容小记

    转载自知乎博主:逍遥王可爱   https://zhuanlan.zhihu.com/p/258369721 1.Mat是什么 Mat是一种图像容器,是二维向量,灰度图的Mat一般存放<ucha ...

  7. 在ROS下利用OpenCV的Mat类,将激光点云展开为深度图像(从零开始,超详细)

    激光雷达3D目标检测任务需要将地面滤除,滤除地面的方法多种多样:基于深度学习.基于栅格.基于平面拟合.基于条件随机场.基于深度图像等等.关于将点云转化为深度图像,PCL库中有相关函数,但使用起来有一定 ...

  8. mat opencv java_OpenCV Mat到JavaCV Mat转换

    您可以使用java.awt.image.BufferedImage作为接口. 您org.opencv.core.Mat对象只是转换为java.awt.image.BufferedImage中再取结果对 ...

  9. OpenCV cv::Mat::checkVector用法的实例(附完整代码)

    OpenCV cv::Mat::checkVector用法的实例 OpenCV cv::Mat::checkVector用法的实例 OpenCV cv::Mat::checkVector用法的实例 # ...

  10. OpenCV基本mat重建的实例(附完整代码)

    OpenCV基本mat重建的实例 OpenCV基本mat重建的实例 OpenCV基本mat重建的实例 #include "opencv2/calib3d.hpp" #include ...

最新文章

  1. 8月组队学习机器学习理论
  2. PHP支持http2,swoole-1.8.2 已发布,支持Http2.0协议
  3. http经典书籍--http权威指南
  4. 阿里HBase的数据管道设施实践与演进
  5. ScrollView以及TextView和对应链接
  6. Mysql 数据库默认值选 ‘‘“ 、Null和Empty String的区别
  7. 拦截导弹(信息学奥赛一本通-T1260)
  8. shell正则表达式去除注释行
  9. 【JSP开发】有关session的登录注销的一个小例子
  10. impala的substr从第几位截到最后一位_天赋不输乔丹,麦迪选秀为何只排第9?看前面几位,第1让老詹吃瘪...
  11. 【百度echarts】实现圆环进度条-代码示例代码demo
  12. MySQL内存及虚拟内存优化设置
  13. 使用IDEA 自带的 MySQL UI 工具插件
  14. Oracle:grouping和rollup
  15. bitlocker驱动器加密的解除方法
  16. 技术人员如何创业(4)---打造超强执行力团队
  17. 可复制的领导力 重点总结读书笔记
  18. 【Windows】无法访问指定设备,路径或文件,您可能没有合适的权限访问这个项目
  19. vue项目如何部署?history与hash模式部署时的区别
  20. 那些中了500万的人过上想要的生活了吗

热门文章

  1. 电脑硬盘坏道怎么检测,又如何修复图文教程
  2. grub的boot loader安装在磁盘上的位置
  3. resize view from nib引起的子控制器视图(childviewcontroller)部分区域无响应
  4. javascript中数组遍历问题
  5. 一个火车上遇到的女孩所引发的联想
  6. [转载]EXT核心API详解Ext.data(八)- Connection/Ajax/Record javascript
  7. ngrok实现内网穿透
  8. [Vue warn]: Invalid prop: custom validator check failed for prop xxx.
  9. Linux下编译hiredis
  10. 45. 正确区分count、find、binary_search、lower_bound、upper_bound和equal_range