【来源】视觉SLAM十四讲,作者 高翔

三角测量是SLAM中,利用相机运动估计特征点空间位置的过程。

本节旨在解决以下问题:

  1. 三角测量的概念
  2. 三角测量的过程及代码实现;
  3. 三角测量有哪些不确定性
  4. 如何提高三角测量的精度

1. 概念

在SLAM中,利用对极几何约束估计相机运动之后,我们还需要通过三角测量来估计地图点的深度。三角测量(三角化)指的是,通过在两处观测同一个点的夹角,从而确定该点的距离。

SLAM中主要用三角化来估计像素点的距离。

2. 过程

按照对极几何的定义,设$x_1,x_2$为两个特征点的归一化坐标,那么他们满足:
$$
s_1x_1=s_2Rx_2+t.
$$
经过对极几何之后,已得到了运动$R,t$,需要求解两个特征点的深度$s_1$,$s_2$。

两个深度可以分开算。若先算$s_2$,那么对上市两个做成一个$x_1$^,得:

该式子左侧为0,右侧可看成是$s_2$的一个方程,可以根据它直接求$s_2$。有了$s_2$,$s_1$也非常容易求出。预测就可以得到两帧下的深度,即确定了空间坐标。

3. 代码实现;

void triangulation (const vector<KeyPoint>& keypoint_1,const vector<KeyPoint>& keypoint_2,const std::vector< DMatch >& matches,const Mat& R, const Mat& t,vector<Point3d>& points
);void triangulation (const vector< KeyPoint >& keypoint_1,const vector< KeyPoint >& keypoint_2,const std::vector< DMatch >& matches,const Mat& R, const Mat& t,vector< Point3d >& points )
{Mat T1 = (Mat_<double> (3,4) <<1,0,0,0,0,1,0,0,0,0,1,0);Mat T2 = (Mat_<double> (3,4) <<R.at<double>(0,0), R.at<double>(0,1), R.at<double>(0,2), t.at<double>(0,0),R.at<double>(1,0), R.at<double>(1,1), R.at<double>(1,2), t.at<double>(1,0),R.at<double>(2,0), R.at<double>(2,1), R.at<double>(2,2), t.at<double>(2,0));Mat K = ( Mat_<double> ( 3,3 ) << 520.9, 0, 325.1, 0, 521.0, 249.7, 0, 0, 1 );vector<Point2d> pts_1, pts_2;for ( DMatch m:matches ){// 将像素坐标转换至相机坐标pts_1.push_back ( pixel2cam( keypoint_1[m.queryIdx].pt, K) );pts_2.push_back ( pixel2cam( keypoint_2[m.trainIdx].pt, K) );}Mat pts_4d;cv::triangulatePoints( T1, T2, pts_1, pts_2, pts_4d );// 转换成非齐次坐标for ( int i=0; i<pts_4d.cols; i++ ){Mat x = pts_4d.col(i);x /= x.at<float>(3,0); // 归一化Point3d p (x.at<float>(0,0),x.at<float>(1,0),x.at<float>(2,0));points.push_back( p );}
}

同时,在main函数中增加三角测量部分,并验证重投影关系:

int main (int argc, char∗∗ argv)
{// .....//												

SLAM中的三角测量相关推荐

  1. OA-SLAM:在视觉SLAM中利用对象进行相机重新定位

    作者 | 鱼肖浓  编辑 | 汽车人 原文链接:https://zhuanlan.zhihu.com/p/587010197 点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷 ...

  2. SLAM | 视觉SLAM中的后端:后端优化算法与建图模板

    点击上方"AI算法修炼营",选择加星标或"置顶" 标题以下,全是干货 前面的话 前面系列一中我们介绍了,VSLAM 是利用多视图几何理论,根据相机拍摄的图像信息 ...

  3. SLAM机器人开发(三)SLAM中常见的里程计

    SLAM机器人开发(三)SLAM中常见的里程计 里程计分类 车轮里程计 惯性里程计 电磁波(光学)雷达 超声波雷达 视觉里程计 里程计对比图 里程计分类 里程计(Odometry)这个词是由希腊单词o ...

  4. 视觉SLAM中PNP求解

    PNP(Perspective-n-points)是SLAM中估计位姿的重要方法.已知条件为路标点在相机1中的相机坐标以及投影到相机2中的像素坐标,据此去估计相机1.相机2间的位姿.主要解法包括DLT ...

  5. 舒尔补在SLAM中的应用

    舒尔补在SLAM中的应用 1.舒尔补的定义 2.舒尔补的由来 3.舒尔补在多元高斯分布中的应用 3.1 多元变量的高斯分布 3.2 边缘概率和条件概率的协方差矩阵 3.3 边缘概率和条件概率的信息矩阵 ...

  6. SLAM中的卡尔曼滤波:究竟滤了谁?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在SLAM系统中,后端优化部分有两大流派. 一派是基于马尔科夫性假 ...

  7. 重磅直播|慕尼黑工业大学博士详解室内SLAM中的几何约束

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 大家好,本公众号现已开启线上视频公开课,主讲人通过B站直播间,对3D视觉领域相关知识点进行讲解,并在微 ...

  8. 视觉SLAM总结——LSD SLAM中关键知识点总结

    视觉SLAM总结--LSD SLAM中关键知识点总结 视觉SLAM总结--LSD SLAM中关键知识点总结 1. LSD SLAM的创新点/关键点是什么? 2. LSD SLAM的整体框架是怎样的? ...

  9. SLAM中有关占据栅格地图的的表示方法和利用激光传感器构建占据栅格地图的方法

    SLAM中有关占据栅格地图的的表示方法和利用激光传感器构建占据栅格地图的方法: https://zhuanlan.zhihu.com/p/21738718

最新文章

  1. 直播|实时音视频抗弱网技术揭秘
  2. Python 装饰器详解(上)
  3. 炸!自动驾驶界又添利器!
  4. c++byte数组和文件的相互转换_5分钟系列之Java类文件结构(三、字节码指令简介)...
  5. mysql 5.5 升级_Windows下MySQL5.5升级MySQL5.7
  6. 常见电脑硬件故障有哪些?如何解决?~~~光驱故障
  7. java audio 分帧_语音特征参数MFCC提取过程详解
  8. vlc web 登录账号_使用VLC Activex插件做网页版视频播放器
  9. 个人免签支付如何对接微信支付宝?
  10. Python爬虫:使用线程池快速下载视频
  11. kill -9 进程 杀掉僵死进程
  12. platEMO:一款强大的多目标优化工具(MATLAB)
  13. Angular4-在线竞拍应用-开发环境的搭建
  14. CSU2104: Extra Judicial Operation-Tarjan边双联通分量缩点两种方法-难受的bug
  15. 接手1号店的京东 更看重与沃尔玛的合作
  16. 快速将Word文件转换成PPT的方法
  17. HTML/CSS 变形(盒子水平垂直居中)、过渡、动画 (学习整理)
  18. 【硬件工程师职业细分】揭秘硬件基带工程师
  19. 【oracle】无法通过 1024 (在表空间 USERS 中) 扩展 ORA-06512
  20. 抓包mysql乱码_抓包数据乱码是什么情况?

热门文章

  1. 一个照片管理(picnic)工具
  2. 程序出错,找不到问题在哪?——我给你方法
  3. 双目立体视觉之立体匹配算法
  4. Jmeter从下载到完成性能测试实战教程(Windows平台)
  5. 池州学院计算机设计大赛,池州学院学生作品获全国性大赛纪录片一等奖
  6. 【微信公众号】3. 后台管理功能简介
  7. PSAM嵌入式驱动——GD32模拟01
  8. android删除文件恢复app,手机删除文件怎么恢复?手机恢复删除App
  9. 当小学语文课堂遇上计算机多媒体,开福区:当语文教学遇上了信息技术
  10. 从工作10年中理解什么是高并发?