三维点云质心与三角化 — python open3d

1 质心介绍        

        质心概念与重心的计算方式相同。如下所示:

        r_{c}=\frac{\sum_{i=1}^{i=n}m_{i}r_{i}}{\sum_{i=1}^{i=n}m_{i}}                                          (1)

        即\sum_{i=1}^{i=n}m_{i}(r_{i}-r_{c})=0                                 (2)​​​​​​​

        乘积mr相当于一个力矩,当作用点为质心时,总的力矩等于零。以杠杆或者天平来说,力矩为零的情况就是总体达到了平衡。所以质心和重心的概念基本一致,但有所区别。

        对于二维图像来说,质量m就是像素值,r为各个像素点的位置。而对于三维点云来说,m取为1,即单位重量。那么根据公式(2)可以知道,点云中各个点相对于质心的距离和为0。m为1时,公式(1)可简化为:

        r_{c}=\frac{\sum_{i=1}^{i=n}r_{i}}{n}                                        (3)

        根据公式(3),三维点云的质心实际上是所有点云坐标的平均值。其中,位置坐标是一个三维向量,由(x,y,z)表示。

        open3d提供了点云的计算方式,即get_center函数。下面可以通过该函数与矩阵平均运算来验证上面的介绍。

2 点云质心python程序验证

        pcd点云数据文件请参考pcd格式点云样例文件-深度学习文档类资源-CSDN下载。

# -*- coding: utf-8 -*-
"""
乐乐感知学堂公众号
@author: https://blog.csdn.net/suiyingy
"""
import open3d as o3d
import numpy as np


if __name__ == '__main__':
    file_path = 'rabbit.pcd'
    pcd = o3d.io.read_point_cloud(file_path)
    pcd.paint_uniform_color([0.5, 0.5, 0.5])#指定显示为灰色
    pcd.translate((0, 10, 0))#原始点云的质心为(0, 0, 0),将其平移到(0, 10, 0)
    print('open3d get_center 质心计算结果', pcd.get_center())

    # 采用矩阵求平均的方法计算质心
    points = np.array(pcd.points)
    center = np.mean(points, axis=0)
    print('矩阵求平均 质心计算结果', center)

3 点云三角化与open3d

        点云三角化是将点云边界的点连接成一个个三角形,相关概念可以通过进一步搜索三角剖分资料来获取。三角化相当于是边界中的三个点组成一个平面,可以近似认为这个三角平面就是目标表面的一部分。因此,点云三角化实际上是三维目标表面的一种近似方法,这种表面近似也可以通过插值来实现。

        点云三角化实现了对物体边界平面的拟合,是三维重建的重要步骤。open3d提供了多种三角化三维重建的函数,这里仅简单提供其中一个函数,其他函数在后续三维重建章节中进行介绍。这个函数是TriangleMesh.create_from_point_cloud_ball_pivoting。其通过旋转球来进行实现,因而其中一个重要参数就是球的半径。

          pcd点云数据文件请参考pcd格式点云样例文件-深度学习文档类资源-CSDN下载。

# -*- coding: utf-8 -*-
"""
乐乐感知学堂公众号
@author: https://blog.csdn.net/suiyingy
"""

import open3d as o3d
import numpy as np


if __name__ == '__main__':
    file_path = 'rabbit.pcd'
    pcd = o3d.io.read_point_cloud(file_path)
    pcd.paint_uniform_color([0.5, 0.5, 0.5])#指定显示为灰色
    print(pcd)

    #pcd需要有法向量
    pcd.estimate_normals()
    # estimate radius for rolling ball
    distances = pcd.compute_nearest_neighbor_distance()
    avg_dist = np.mean(distances)
    radius = 6 * avg_dist   

    mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(
           pcd,
           o3d.utility.DoubleVector([radius, radius * 2]))
    
    # 点云显示
    o3d.visualization.draw_geometries([mesh], #点云列表
                                      window_name="点云三角化",
                                      point_show_normal=False,
                                      width=800,  # 窗口宽度
                                      height=600,
                                      mesh_show_wireframe=True,#显示三角网格线
                                      mesh_show_back_face=True,#显示法向量垂直被部的平面
                                      )  # 窗口高度

                                      

4 三角化效果图

三维点云质心与三角化 — python open3d_第1张图片

python三维点云从基础到深度学习_Coding的叶子的博客-CSDN博客_3d点云 python从三维基础知识到深度学习,将按照以下目录持续进行更新。https://blog.csdn.net/suiyingy/article/details/124017716

更多三维、二维感知算法和金融量化分析算法请关注“乐乐感知学堂”微信公众号,并将持续进行更新。

你可能感兴趣的:(三维点云,python,点云质心,三角化,open3d,点云,python)