【问题标题】:opencv triangulatePoints resulting in NaN valuesopencv triangulatePoints 导致 NaN 值
【发布时间】:2018-04-03 22:31:39
【问题描述】:

我正在尝试从运动代码实现标准结构,但 triangulatePoints 会产生 NaN 值。 我执行以下步骤 -

  1. 获取图像 1 和图像 2 的 ORB 特征。
  2. 匹配特征。
  3. 使用 findEssentialMat() 从匹配的特征和可用的相机内在信息中获取基本矩阵
  4. 使用recoverPose() 获取摄像机2 的位姿。假设摄像机1 位于原点。
  5. 获取 camera1 和 camera2 的投影矩阵。
  6. 使用 triangulatePoints() 获取 3D 点。

我已经尝试了 Matlab triangulate() 函数以及 camera1 和 camera2 的投影矩阵以及上面获得的匹配点。在 Matlab 的情况下,我得到了很好的结果。 但是在 C++ (Opencv 3.3) 中使用 opencv 我得到 NaN 值。

【问题讨论】:

  • 您是否验证了步骤 1、2、3、4 和 5 的结果?我的意思是,您是否在 OpenCV 的每个步骤中都获得了正确的数据?您可以发布用于三角点的代码吗?
  • 是的,对于第 1 步和第 2 步,我使用 drawMatches() 查看匹配点,它们看起来一致。对于步骤 3、4、5,我将计算值输入到 Matlab 三角函数,这也给了我一致的结果。我按如下方式调用 triangulatePoints() - vector src,dst; // 图像 1 和图像 2 上的匹配点 Mat point3D; triangulatePoints(cam1,cam2,src,dst,point3D); // cam1 和 cam2 是 3x4 矩阵

标签: c++ opencv


【解决方案1】:

我还遇到了来自 opencv 的 triangulatePoints 的问题。 这是由于输入点数组的类型错误:

  • 点的形状必须为:2xN 或大小为 1xN 或 Nx1 的两通道矩阵
  • 必须是 float! 类型

除此之外,我唯一能想到的另一件事可能是计算的 3d 点可能是无穷大,因此在转换为欧几里得坐标后,它们被零除 -> NaN

【讨论】:

    猜你喜欢
    • 2015-12-29
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多