三角形法恢复空间点深度
来源:互联网 发布:js 点击保存图片 编辑:程序博客网 时间:2024/04/23 18:28
三角形法恢复空间点深度
通常,在已知两个相机的相对位姿
1.求解空间点坐标
当我们得到两个视图的一组匹配点,我们希望能恢复出世界点在三维世界的坐标。这里就涉及到使用三角形法来恢复点在3D空间的结构。一般比较常用的方法是线性三角形法(Linear triangulation methods )。线性三角形法使用直接线性变化(DLT)对点的世界坐标进行求解。
已知点对
使用DLT我们需要把式子改变成
把
即
可见第三个式子可以由上两个式子线性表示,所以只需要取前连个式子即可,从而有形如
由于
ORB-SLAM21中的三角形法的代码如下:
void Initializer::Triangulate(const cv::KeyPoint &kp1, const cv::KeyPoint &kp2, const cv::Mat &P1, const cv::Mat &P2, cv::Mat &x3D){ cv::Mat A(4,4,CV_32F); A.row(0) = kp1.pt.x*P1.row(2)-P1.row(0); A.row(1) = kp1.pt.y*P1.row(2)-P1.row(1); A.row(2) = kp2.pt.x*P2.row(2)-P2.row(0); A.row(3) = kp2.pt.y*P2.row(2)-P2.row(1); cv::Mat u,w,vt; cv::SVD::compute(A,w,u,vt,cv::SVD::MODIFY_A| cv::SVD::FULL_UV); x3D = vt.row(3).t(); x3D = x3D.rowRange(0,3)/x3D.at<float>(3);}
2.求解空间点深度
在深度滤波中经常使用这种形式,通常把首先观测到某一个图像点
这里的
这里的
这里就是
所以解得:
在SVO2中的实现如下,返回在参考帧下点的深度:
bool depthFromTriangulation( const SE3& T_search_ref, const Vector3d& f_ref, const Vector3d& f_cur, double& depth){ Matrix<double,3,2> A; A << T_search_ref.rotation_matrix() * f_ref, f_cur; const Matrix2d AtA = A.transpose()*A; if(AtA.determinant() < 0.000001) return false; // d = - (ATA)^(-1) * AT * t const Vector2d depth2 = - AtA.inverse()*A.transpose()*T_search_ref.translation(); depth = fabs(depth2[0]); return true;}
由于解向量
float3 triangulatenNonLin( const float3 &bearing_vector_ref, const float3 &bearing_vector_curr, const SE3<float> &T_ref_curr){ const float3 t = T_ref_curr.getTranslation(); float3 f2 = T_ref_curr.rotate(bearing_vector_curr); const float2 b = make_float2(dot(t, bearing_vector_ref), dot(t, f2)); float A[2*2]; A[0] = dot(bearing_vector_ref, bearing_vector_ref); A[2] = dot(bearing_vector_ref, f2); A[1] = -A[2]; A[3] = dot(-f2, f2); const float2 lambdavec = make_float2(A[3]*b.x - A[1]*b.y, -A[2]*b.x + A[0]*b.y) / (A[0]*A[3] - A[1]*A[2]); const float3 xm = lambdavec.x * bearing_vector_ref; const float3 xn = t + lambdavec.y * f2; return (xm + xn)/2.0f;}
参考
- 泡泡机器人ORB-SLAM2注释
- Multiple View Geometry in Computer Vision,Second Edition, 12.2 P312 & A5.2.1 P591
- https://github.com/raulmur/ORB_SLAM2/blob/master/src/Initializer.cc#L734 ↩
- https://github.com/uzh-rpg/rpg_svo/blob/master/svo/src/matcher.cpp#L109 ↩
- https://github.com/uzh-rpg/rpg_open_remode/blob/master/src/triangulation.cu#L30 ↩
- https://github.com/gaoxiang12/slambook/blob/master/ch13/dense_monocular/dense_mapping.cpp#L348 ↩
- 三角形法恢复空间点深度
- 线性三角形法确定空间点三维坐标
- 表空间时间点恢复
- RMAN表空间时间点恢复
- TSPITR 基于表空间时间点恢复
- 表空间时间点恢复(TSPITR)简介
- 表空间时间点恢复--TSPITR实验
- TSPITR--表空间时间点恢复技术
- Oracle 表空间时间点恢复 (TSPITR)
- 实验表空间时间点恢复(TSPITR)
- RMAN表空间时间点恢复,TSPITR
- 备份恢复11——表空间时间点恢复
- 手动实现表空间基于时间点的恢复
- rman表空间基于时间点的不完全恢复
- TSPITR(基于时间点的表空间恢复)
- Oracle DB 执行表空间时间点恢复
- oracle TSPITR(执行表空间时间点恢复)
- 表空间基于时间点的恢复(TSPITR)
- Socket编程(ServerScoket, Socket) 回声例子
- Android
- Java I/O关于缓冲区部分提高性能的源码分析【Stream】
- mac 安装python虚拟环境,多版本共存
- (转载)Linux内核源代码情景分析---第四章 进程与进程调度
- 三角形法恢复空间点深度
- 优秀的主页设计
- 关于mysql中设置隔一段事件调用一个存储过程的事件
- Java正则表达式入门
- 如何判断直线和圆的位置关系?
- android 5.0以上so文件关于平台支持问题的浅析
- angular4 英雄编辑器
- Android常用开源项目(六)
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛—H