首页 文章

OpenCV >>运动,三角测量的结构

提问于
浏览
1

Use-case


  • 使用随机点生成合成3D场景

  • 生成两个合成相机

  • 获取2个相机2D投影

  • 导出基本矩阵和基本矩阵

  • 使用Essential矩阵导出旋转和平移

  • 对2个2D投影进行三角测量以得到初始3D场景

Implementation


  • 生成随机3D点(x,y,z)

  • 相机内在矩阵是静态定义的

  • 静态定义旋转矩阵(Z轴旋转25度)

  • 身份翻译矩阵(无翻译)

  • 合成生成两个投影(K * R * T)

  • 使用cv :: findFundamentalMat(F)解析基本矩阵

  • 基本矩阵E使用'K.t() * F * K'计算

  • 使用SVD提取相机外部因素,产生4种可能的解决方案(根据'Hartley&Zisserman多视图几何第9.2.6章)

  • 使用cv :: triangulatePoints以下列方式完成三角测量:cv :: triangulatePoints(K * matRotIdentity,K * R * T,v1,v2,points);

  • 'points'是一个4行N列矩阵,具有齐次坐标(x,y,z,w)
    通过将'x, y, z'与'w'分开,将

  • 'points'转换为非齐次(局部)坐标

The result


生成的3D点与原始点匹配到一个比例(在我的情况下为~144) .

问题

  • 摄像机翻译是按照比例(#8)推导出来的,考虑到这一点,假设三角测量结果也达到一定比例是否正确?

  • 是否有可能在没有先前了解相机位置或点的绝对大小的情况下推导出无标度?

任何帮助,将不胜感激 .

编辑:

我试图使用完全相同的投影矩阵用于3D - > 2D投影从2D转换回3D(使用cv :: tirangulatePoints),令人惊讶的是,这导致了一个空矢量(所有3D点都有x,y, z,w == 0),这最终是因为两个摄像机仅通过旋转而不是通过变换而不同,因此,两个投影线是正交的(在3D空间中)导致零长度基线(极线)而不是平面),因此,最小化x,y,z == 0处的距离,得到空向量 .

在两个摄像机之间添加平移导致正确恢复原始坐标,但是,考虑到我使用完全相同的投影矩阵进行3D到2D传输,然后,3D再回到2D三角剖分 .

当进行相机姿态估计(从点对应中提取投影矩阵)时,平移被导出到一个尺度,因此,三角测量结果也达到一定范围 .

问题

是否有可能以公制/像素,...单位而不是达到一定比例来推导平移的差异(相机移动了多少)?需要什么先验知识?

2 回答

  • 3
    • 三角测量点与用于三角测量的摄像机位于同一坐标系中...

    • 实际上,没有 .

  • 0

    想想它就像你有图像显示一个房间 . 您不知道房间是否符合人类的正常尺寸,或者是否在火柴盒中 .

    要知道对象的实际大小,您必须知道以下措施之一:

    • 场景中一个对象的大小

    • 摄像机之间的距离(在您想要的坐标系中)

    对于后一点,如果您有许多图像和正确的GPS坐标,则可以使用GPS坐标获取最小二乘结果 . 因此,您必须在公制系统中获取GPS坐标(WGS84),例如UTM .

相关问题