【问题标题】:Plane construction from 3D Points in OpenCV在 OpenCV 中从 3D 点构建平面
【发布时间】:2015-11-30 11:09:58
【问题描述】:

我想从 OpenCV 中的 3D 点列表构建一个平面。我想通过查找以下形式的四个参数来获得结果:Ax+By+Cz+D = 0。有人会建议我一种方法吗?

【问题讨论】:

  • 数据是否包含异常值?
  • 主成分分析理论上应该会给出不错的结果。不过,我建议您使用简单的 RANSAC 方法。您应该展示您的点的 3D 图像,以了解您的设置。
  • 也许某种线性最小二乘法可以帮助你?
  • @HumamHelfawi 好吧,此时异常值被忽略
  • 所以看我的回答它会解决问题,你可能会问任何歧义。

标签: opencv


【解决方案1】:

如果数据不包含异常值且不包含多个平面。此外,所有的点都在一个平面上(数据没有噪音),就是这么简单:

  1. 随机选取三个不在同一条线上的点。
  2. 求解这个线性方程组:
x1+by1+cz1+d = 0
x2+by2+cz2+d = 0
x3+by3+cz3+d = 0

然后:

A= Choose any number you want in order to match your scale. 
B= b*A 
C= c*A 
D= d*A

如果数据嘈杂或包含异常值或超过平面(或两者),则需要某种鲁棒估计技术。搜索 RANSAC 作为开始。

如果你熟悉 RANSAC,你可以在这里看到this example(这是关于你可以简单地将其泛化为处理平面的行)

【讨论】:

  • 最后,我找到了使用类SVD解决问题的方法。首先,我将平面方程从 AX+BY+CZ+D = 0 转换为 A'X+B'Y+C' = Z,因此表征平面所需的参数变为 3。然后通过应用 SVD sample(leftMatrix); sample.backSubst(z, result); 其中 leftMatrix 是包含每一行 (x_i, y_i, 1) 的 *3 矩阵,z就是n*1矩阵形式的z坐标的所有点,变量“result”最终包含计算出的平面参数。
  • 无论如何,感谢您的回答,因为您的回答启发了我找到当前的解决方案。
  • 很高兴它有帮助。您可以接受这个答案,或者尝试自己写一个完整的答案并接受自己的答案。祝你好运
【解决方案2】:

利用 OpenCV 回答

如果你想用3点求解方程,如下所示:

ax + by + cz = 1

示例

你有三个点:cv::Point3f p1、p2 和 p3,下面是代码:

cv::Matx33f M(p1.x, p1.y, p1.z,
              p2.x, p2.y, p2.z,
              p3.x, p3.y, p3.z);
cv::Vec3f d(1, 1, 1);
cv::Vec3f coef = M.inv() * d;

那么a,b,c依次为coef(0),coef(1),coef(2)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多