从本质矩阵恢复相机矩阵
来源:互联网 发布:天下3 英雄榜数据 编辑:程序博客网 时间:2024/06/06 01:02
本质矩阵
本质矩阵(essential matrix )是基本矩阵在归一化图像坐标下的一种特殊形式。
考虑相机矩阵
对于一对对应点
而对本质矩阵,给定一对对应点
把点对应关系
考虑相机矩阵
从而有
本质矩阵的性质
其中
反对称矩阵的性质
如果一个矩阵
可以观察到,当
如果
这里的
这里的
综上所述,实反对称矩阵
M 可以分解为M=UNUT 的形式,U 为正交矩阵,其中N 是形如diag(m1D,m2D,...,mnD,0,...,0)T 的分块矩阵,其中D=[0−110] 。
本质矩阵的性质
本质矩阵
在相差一个尺度因子的情况下,
观察到这里的
因此本质矩阵的奇异值分解可以表示为
所以本质矩阵分解有两种情况,但都有如下形式
并且我们有如下结论(性质)
一个矩阵是本质矩阵的充要条件是其奇异值中有两个相等且第三个是
0
本质矩阵的分解
我们希望通过本质矩阵的SVD分解得到
设
因此有
这里回顾
接下来我们考虑
则
综上,本质矩阵的分解一共有
下图的四种情况就是上述四种解对应的两个相机之间的关系。其实这四种情况中只有一种是符合实际的解,只需要根据上述的解根据三角法去计算3D点的坐标,只有当两个相机观测到3D点都在前方,也就是深度都为正,才是最终的解。
下面的是ORB-SLAM2中本质矩阵分解的代码
void Initializer::DecomposeE(const cv::Mat &E, cv::Mat &R1, cv::Mat &R2, cv::Mat &t){ cv::Mat u,w,vt; cv::SVD::compute(E,w,u,vt); u.col(2).copyTo(t); t=t/cv::norm(t); cv::Mat W(3,3,CV_32F,cv::Scalar(0)); W.at<float>(0,1)=-1; W.at<float>(1,0)=1; W.at<float>(2,2)=1; R1 = u*W*vt; if(cv::determinant(R1)<0) R1=-R1; R2 = u*W.t()*vt; if(cv::determinant(R2)<0) R2=-R2;}
以及OpenCV中的代码
void cv::decomposeEssentialMat( InputArray _E, OutputArray _R1, OutputArray _R2, OutputArray _t ){ Mat E = _E.getMat().reshape(1, 3); CV_Assert(E.cols == 3 && E.rows == 3); Mat D, U, Vt; SVD::compute(E, D, U, Vt); if (determinant(U) < 0) U *= -1.; if (determinant(Vt) < 0) Vt *= -1.; Mat W = (Mat_<double>(3, 3) << 0, 1, 0, -1, 0, 0, 0, 0, 1); W.convertTo(W, E.type()); Mat R1, R2, t; R1 = U * W * Vt; R2 = U * W.t() * Vt; t = U.col(2) * 1.0; R1.copyTo(_R1); R2.copyTo(_R2); t.copyTo(_t);}
之后对四个解做判断的代码在这里,篇幅过长则不贴出
- ORB-SLAM2,主要在CheckRT这个函数
- OpenCV
参考
Multipe View Geometry in Computer Vision II, 9.6
Properties of antisymmetric matrices
Camera Computation and the Essential Matrix
- 从本质矩阵恢复相机矩阵
- 通过基础矩阵和本质矩阵恢复摄像机矩阵
- 本质矩阵
- 本质矩阵
- 单应性矩阵、本质矩阵
- 基础矩阵与本质矩阵
- 本质矩阵和基础矩阵
- 单应矩阵,基本矩阵,本质矩阵 1.归一化图像坐标 2.本质矩阵 essential matrix 2.1 本质矩阵的推导 2.2特点 3.相机内参 4.基本矩阵 fundamental matrix
- 单应矩阵,基本矩阵,本质矩阵
- 矩阵的本质理解
- 矩阵的本质
- 矩阵的本质
- 理解矩阵的本质
- 矩阵的本质
- 矩阵相乘的本质
- 【立体视觉(一)】由基本矩阵、本质矩阵恢复摄像机矩阵——Structure from motion
- 推导相机变换矩阵
- 相机变换矩阵
- 监控系统中N制和P制区别
- 旋转矩阵
- path.resolve(_dirname,filename)__dirname变量
- Codeforces 329B bfs
- SSDT表的遍历(源码)
- 从本质矩阵恢复相机矩阵
- 红黑树优点
- Python 中 with用法及原理
- maven 项目中一个模块的debug调试
- Map在多线程中使用
- linux centos挂载盘
- 关于文件读写缓存的问题(flush的使用场景)
- lnmp开发laravel的nginx配置
- Linux驱动学习笔记----------input输入子系统(基本概念与流程)