3D点云平面拟合算法

这篇具有很好参考价值的文章主要介绍了3D点云平面拟合算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

假设你有一组 3D 中的 n 个点,并且想要为它们拟合一个平面。 在本文中,我将推导出一个简单的、数值稳定的方法,并提供它的源代码。 听起来很好玩? 我们开始吧!

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎

首先,如果在网上寻找答案,你将得到的答案包括对协方差矩阵进行奇异值分解以找到最小特征值的特征向量。 然而事实证明,这让事情变得比他们需要的更加复杂。 让我们从基础开始:

平面通常由法向量 n = [a, b, c]ᵀ 和距离 d 描述,因此对于平面 n · p + d = 0 上的点 p = [x, y, z]ᵀ。我们可以 将其写为:

3D点云平面拟合算法,算法

但请注意,这是超定的 - 解空间(平面)是三维的,但上面的描述使用了四个值。 因此,让我们首先通过限制解决方案空间来删除一个组件。 我们通过任意指定 c = 1 来实现这一点,即平面法线的 z 分量始终为 1(请注意,法线的长度不需要为 1)。 如果你认为这是一个潜在有问题的假设,那么你是对的——我们稍后会再讨论这个问题。 现在,让我们定义:

3D点云平面拟合算法,算法

并求解a、b、d。 矩阵形式:

3D点云平面拟合算法,算法

接下来,我们将这个矩阵转置,然后从左侧相乘以执行线性最小二乘:

3D点云平面拟合算法,算法

转置后相乘:

3D点云平面拟合算法,算法

其中 N 是点数。 现在这是聪明的部分:让我们定义上面的 x,y,z 相对于点云的质心(平均值)。 现在 Σx = Σy = Σz = 0 所以我们可以简化为:

3D点云平面拟合算法,算法

从最后一行(N·d = 0)我们可以得出结论:d = 0。这意味着如果所有点都相对于点云的质心,则平面穿过原点。 换句话说:平面始终穿过输入点的平均值。 我们现在可以去掉一个维度:

3D点云平面拟合算法,算法

克莱默规则告诉我们:

3D点云平面拟合算法,算法

我们可以通过将 n 乘以 D 来简化它(无论如何我们都需要对 n 进行归一化),这给我们:

3D点云平面拟合算法,算法

就是这样! 但请记住我们的假设:平面法线的 z 分量不为零。 如果为零怎么办? 那么可以证明上面的行列式 D 变为零并且我们可以除以零。 即使它不完全为零,但很接近,我们仍然会得到不好的条件,从而得到不好的结果。 所以,我们能做些什么? 好吧,如果这些点跨越一个平面,则法线的至少一个分量必须非零。 因此,让我们对三个单独的假设进行上述计算,其中哪个分量不为零。 然后我们简单地选择表现最好的一个,即具有最大行列式的那个。

注意:此方法将最小化垂直于主轴的残差的平方,而不是垂直于平面的残差的平方。 如果残差很小(即你的点都靠近生成的平面),那么这种方法可能就足够了。 但是,如果你的点分布比较分散,那么此方法可能不是最合适的。

这是 Rust 代码:

// Constructs a plane from a collection of points
// so that the summed squared distance to all points is minimzized
fn plane_from_points(points: &[Vec3]) -> Option<Plane> {
    if points.len() < 3 {
        return None; // At least three points required
    }

    let mut sum = Vec3{x:0.0, y:0.0, z:0.0};
    for p in points {
        sum += p;
    }
    let centroid = sum * (1.0 / (points.len() as f64));

    // Calc full 3x3 covariance matrix, excluding symmetries:
    let mut xx = 0.0; let mut xy = 0.0; let mut xz = 0.0;
    let mut yy = 0.0; let mut yz = 0.0; let mut zz = 0.0;

    for p in points {
        let r = p - centroid;
        xx += r.x * r.x;
        xy += r.x * r.y;
        xz += r.x * r.z;
        yy += r.y * r.y;
        yz += r.y * r.z;
        zz += r.z * r.z;
    }

    let det_x = yy*zz - yz*yz;
    let det_y = xx*zz - xz*xz;
    let det_z = xx*yy - xy*xy;

    let det_max = max3(det_x, det_y, det_z);
    if det_max <= 0.0 {
        return None; // The points don't span a plane
    }

    // Pick path with best conditioning:
    let dir =
        if det_max == det_x {
            Vec3{
                x: det_x,
                y: xz*yz - xy*zz,
                z: xy*yz - xz*yy,
            }
        } else if det_max == det_y {
            Vec3{
                x: xz*yz - xy*zz,
                y: det_y,
                z: xy*xz - yz*xx,
            }
        } else {
            Vec3{
                x: xy*yz - xz*yy,
                y: xy*xz - yz*xx,
                z: det_z,
            }
        };

    Some(plane_from_point_and_normal(centroid, normalize(dir)))
}

原文链接:3D点云平面拟合 - BimAnt文章来源地址https://www.toymoban.com/news/detail-784394.html

到了这里,关于3D点云平面拟合算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 3D点云处理:拟合球(附源码)

    订阅说明:如果要订阅,先看链接内容 看链接内容 看链接内容:订阅先看此内容 文章目录: 3D视觉个人学习目录       球面拟合是一种用于找到最佳拟合球体的方法,通常使用最小二乘法进行拟合。为了使用最小二乘法拟合球,我们首先需要定义一个损失函数,并通过最

    2024年02月10日
    浏览(25)
  • Open3D Ransac拟合分割多个平面(方法二)

      算法的核心原理还是RANSAC拟合平面,具体理论可参考:Open3D 使用RANSAC分割平面。只是对代码稍加修改使其适用于分割点云数据中的多个平面。

    2024年02月12日
    浏览(26)
  • Halcon3d 点云计算平面度

    2024年02月11日
    浏览(28)
  • 3D测量之圆孔测量 拟合圆 点云变换

    此文中的圆孔测量是一项3D视觉技术,旨在精确测量物体表面上的圆孔的直径和中心坐标。通过使用高精度3D相机(线激光轮廓仪或结构体等)采集原始点云数据,通过3D视觉算法能够快速、准确地分析物体上的圆孔特征,为制造和工程领域提供了强大的测量工具。 圆孔测量在

    2024年02月04日
    浏览(30)
  • Open3D 最小二乘拟合平面(SVD分解法)

    本文由CSDN点云侠原创,原文链接。爬虫网站自重。 本文实现矩阵奇异值分解方法的最小二乘拟合平面。原理如下:   对于得到的

    2024年02月13日
    浏览(32)
  • 切比雪夫(最小区域法)平面拟合算法

    欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击。 本期话题:切比雪夫(最小区域法)平面拟合算法 相关背景和理论 点击前往 主要介绍了应用背景和如何转化成线性规划问题 10到631个点,全部采样自平面附近。 每个点3个坐标,坐标精确到小数点

    2024年03月28日
    浏览(55)
  • ransac拟合平面,代替open3d的segment_plane

    使用open3d拟合平面并且求平面的法向量,open3d打包大概1个g的大小。 https://github.com/leomariga/pyRANSAC-3D/blob/master/pyransac3d/plane.py 用的时候发现代码的速度比open3d的慢了50ms左右。找了一圈找到方法了 https://zhuanlan.zhihu.com/p/62238520 就是替换循环次数 经过测试发现,拟合的平面的精度

    2024年02月11日
    浏览(25)
  • 3D点云处理:圆柱侧面点云展开为平面 凹凸缺陷检测(附源码)

    订阅说明:如果要订阅,先看链接内容 看链接内容 看链接内容:订阅先看此内容 文章目录: 3D视觉个人学习目录 目标:对采集的圆柱面点云展开为平面; 应用:可用于检测圆柱侧面的凹凸缺陷;       圆柱的侧面展开原理是将一个圆柱体(或柱体)的侧面展开成一个矩

    2024年02月09日
    浏览(102)
  • RANSAC算法在Python中的实现与应用探索:线性拟合与平面拟合示例

    第一部分:RANSAC算法与其应用 在我们的日常生活和多个领域中,如机器学习,计算机视觉,模式识别等,处理数据是一个非常重要的任务。尤其是当我们需要从嘈杂的数据中获取信息或拟合模型时。有时候,数据可能包含异常值或噪声,这可能会对我们的结果产生重大影响。

    2024年02月13日
    浏览(31)
  • Open3D 实现建筑物点云立面和平面分割提取

    Open3D 实现建筑物点云立面和平面分割提取 点云数据在现实场景中广泛应用,例如建筑物三维重建、智能交通等领域。然而,点云数据量庞大且噪声较多,因此需要对其进行处理和分析。Open3D 是一款开源的跨平台点云处理库,在点云数据预处理、三维重建和可视化等方面有着

    2024年02月07日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包