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

时间:2014-04-23 19:46:59

标签: algorithm opencv computer-vision

使用例


  1. 使用随机点生成合成3D场景
  2. 生成两个合成相机
  3. 获取2个相机2D投影
  4. 推导基本&基本矩阵
  5. 推动轮换&使用基本矩阵进行翻译
  6. 对2个2D投影进行三角测量以产生初始3D场景
  7. 实施


    1. 生成随机3D点(x,y,z)
    2. 相机内在矩阵是静态定义的
    3. 静止定义旋转矩阵(Z轴旋转25度)
    4. 身份转换矩阵(无翻译)
    5. 合成生成两个投影(K * R * T)
    6. 使用cv :: findFundamentalMat(F)
    7. 解析基本矩阵
    8. 基本矩阵E使用' K.t()* F * K'
    9. 计算
    10. 使用SVD提取相机外在因素,产生4种可能的解决方案(根据' Hartley& Zisserman多视图几何第9.2.6章)
    11. 使用cv :: triangulatePoints以下列方式完成三角测量: cv :: triangulatePoints(K * matRotIdentity,K * R * T,v1,v2,points);
    12. '点'是一个4行N列矩阵,具有齐次坐标(x,y,z,w)
    13. '点'通过划分x,y,z'将其转换为非均匀(局部)坐标与' w'
    14. 结果


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

      问题

      1. 相机转换是按照比例(#8)推导出来的,考虑到这一点,假设三角测量结果也达到了一定的比例是正确的吗?
      2. 是否有可能在没有先前了解相机位置或点的绝对大小的情况下得出比例?
      3. 任何帮助都将不胜感激。



        编辑:

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

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

        当进行相机姿态估计(从点对应中提取投影矩阵)时,转换得到一个比例,因此,三角测量结果也达到了一定的范围。

        问题

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

2 个答案:

答案 0 :(得分:3)

  1. 三角测量点与用于三角测量的相机位于同一坐标系中...

  2. 在实际意义上,不是。

答案 1 :(得分:0)

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

要了解对象的实际大小,您必须了解其中一项措施:

  1. 场景中一个对象的大小
  2. 摄像机之间的距离(在您想要的坐标系中)
  3. 对于后一点,如果您有许多图像和正确的GPS坐标,则可以使用GPS坐标获取最小二乘结果。因此,您必须在公制系统中获取GPS坐标(WGS84),例如UTM。