triangulatePoints函数
cv::triangulatePoints
函数参数
两个相机位姿和特征点在两个相机坐标系下的坐标,输出三角化后的特征点的3D坐标。
注意:输出的3D坐标是齐次坐标,共四个维度,因此需要将前三个维度除以第四个维度以得到非齐次坐标xyz。这个坐标是在相机坐标系下的坐标,以输入的两个相机位姿所在的坐标系为准。
在主函数中,通过把3D坐标重投影到两个相机的归一化平面上,从而计算重投影误差。因此需要再次对xyz坐标同时除以z,以得到归一化平面上的坐标。
1.对极几何
从2张图片中,得到若干个配对好的2d特征点,就可以运用对极几何来恢复出两帧之间的运动.
设P的空间坐标为:
两个像素点p1,p2的像素坐标为:
K为相机内参,R,t为图像1到图像2的旋转矩阵和平移矩阵.
相机姿态估计问题变成以下两步:
- 根据配对点的像素位置求出R或者F
- 根据E或F求出R,t
2.本质矩阵
根据本质矩阵
定义,这是一个3*3的矩阵,经典是使用8点法来求解.求解出E后,可通过奇异值分解得到相机的运动R和t.
注意:求出的E和t具有尺度一致性,通常把t进行归一化.
3.尺度不确定性
对t的长度归一化,直接导致单目视觉的尺度不确定性.解决办法可以通过SLAM的初始化来解决,初始时,使机器人平移一段距离,然后以此距离作为平移的单位.初始化之后,就可以使用3D-2D来计算相机运动了
工程中,通常匹配的点比较多,这时可以通过构造最小二乘法来进行求解E,但是由于存在误匹配的情况,所以更多的是使用随机采样一致性(RANSAC)来求解
4.三角测距来测量深度
根据对极几何的定义,x1,x2
5.验证
通过方程 对第一帧3D坐标进行重投影,得到第二帧3D坐标
代码为:
Mat pt2_trans = R*( Mat_<double>(3,1) << points[i].x, points[i].y, points[i].z ) + t;
通过4中计算得到的第二帧3D点,除以z得到第二帧相机归一化坐标
pt2_trans /= pt2_trans.at<double>(2,0);
triangulatePoints函数相关推荐
- 三. 2d-2d三角化求路标point
int main(int argc, char** argv) { Mat img_1 = imread("1.png"); Mat img_2 = imread("2. ...
- SLAM基础问题总结(1)
1.如何对匹配好的点做进一步的处理,更好保证匹配效果 (1)确定匹配最大距离,汉明距离小于最小距离的两倍 (2)使用KNN-matching算法,令K=2.则每个match得到两个最接近的descri ...
- 3D视觉(五):对极几何和三角测量
3D视觉(五):对极几何和三角测量 对极几何(Epipolar Geometry)描述的是两幅视图之间的内在射影关系,与外部场景无关,只依赖于摄像机内参数和这两幅试图之间的的相对姿态. 文章目录 3D ...
- 基于高速相机的近地落点三维坐标测试方法
高速相机可以捕捉到高帧率的图像序列,这使得它们非常适合用于捕获快速运动的物体,如近地落点.要使用高速相机进行近地落点的三维坐标测试,你可以采用立体视觉技术.立体视觉技术的基本原理是使用两台或多台相机从 ...
- EmguCV 常用函数功能说明
AbsDiff,计算两个数组之间的绝对差. dst(I)c = abs(src1(I)c-src2(I)c).所有数组必须具有相同的数据类型和相同的大小(或ROI大小). 累加,将整个图像或其所选区域 ...
- 数据库中自定义排序规则,Mysql中自定义字段排序规则,Oracle中自定义字段排序规则,decode函数的用法,field函数的用法
数据库中自定义排序 场景:有一张banner表,表中有一个status字段,有0, 1, 2三个状态位,我想要 1,0,2的自定义排序(这里是重点),然后再进行之上对sequence字段进行二次排序( ...
- Mysql函数group_concat、find_in_set 多值分隔字符字段进行数据库字段值翻译
Mysql函数group_concat.find_in_set进行数据库字段值翻译 场景 配方表:记录包含的原料 sources表示原料,字段值之间用逗号分隔 原料表:对应原料id和原料名称 现需要查 ...
- C++ 笔记(34)— C++ exit 函数
当遇到 main 函数中的 return 语句时,C++ 程序将停止执行.但其他函数结束时,程序并不会停止.程序的控制将返回到函数调用之后的位置.然而,有时候会出现一些非常少见的情况,使得程序有必要在 ...
- C++ 笔记(30)— 友元函数与友元类
我们知道类的私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行.这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书写的麻烦. ...
最新文章
- faster rcnn结构
- Python运算符可不只有加减乘除
- php与mysql列表_PHP+Mysql+jQuery实现的查询和列表框选择
- JavaScript知识概要
- Linux配置自建 YUM 软件存储库
- 3dmax如何快速查找丢失贴图,并根据贴图快速找到对应物体
- SSM毕设项目汽车4S店管理系统ei9uo(java+VUE+Mybatis+Maven+Mysql)
- 485通讯的校验和_MCGS 与 FX3U PLC 之间的无线通讯实例
- 软件暴力破解的原理和破解经验
- FPS 游戏飞天遁地原理
- win10计算机网络共享打不开,win10系统网络和共享中心打不开的详细方案
- 面试准备之java8的新特性
- linux内存条故障,linux – 如何从MCE消息中找到故障内存模块?
- 这年头居然还有用360卫士清理垃圾的?那玩意就是最大的...Python自动清理不香吗?
- 前端后端nginx配置
- C语言单分支if语句形式,2 单分支if语句
- 计算机使用方法的书,是否知道飞鸽传书软件的详细使用方法?查看介绍
- rsi红绿多空波段副图指标 rsi指标公式趋势,兼容通达信公式
- Java复习打卡day40
- 【源码】YOLOv5云端API部署