【点云可视化】自制ply文件并使用open3d可视化点云

使用open3d可视化点云,需要将点云制作为ply文件传入函数中。

安装open3d

直接使用pip安装

pip install open3d

ply文件

ply文件的结构为:文件头+数据内容,文件头从 ply 一行开始,到 end_header 为止,里面定义了此 ply文件中数据的组织形式,包括数据类型和个数。后面是点云的坐标信息及每个点的颜色属性的,参考

如下为具有5个点的点云,end_header后每一行表示一个点的x,y,z,R,G,B信息

ply
format ascii 1.0
comment PCL generated
element vertex 5
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
end_header
-0.25412 -0.11759 0.01171 255 0 255
0.18866 0.0793 0.00609 255 0 255
0.03777 0.06232 -0.00753 255 0 255
-0.25185 -0.08387 -0.01735 255 0 255
-0.35174 -0.16687 -0.00875 0 255 0

假设该文件为test.ply文件,则pyhon中使用open3d进行可视化命令为

import open3d as o3d
# visualization of point clouds.
pcd = o3d.io.read_point_cloud('test.ply')
o3d.visualization.draw_geometries([pcd])

在这里插入图片描述

自制ply文件

将numpy格式的点云转换为ply文件进行可视化很简单,根据上面的格式来写文件即可,下面给出一个参考

import open3d as o3d
import numpy as np

def makePlyFile(xyzs, labels, fileName='makeply.ply'):
    '''Make a ply file for open3d.visualization.draw_geometries
    :param xyzs:    numpy array of point clouds 3D coordinate, shape (numpoints, 3).
    :param labels:  numpy array of point label, shape (numpoints, ).
    '''
    RGBS = [
        (0, 255, 255),
        (255, 0, 0),
        (0, 255, 0),
        (0, 0, 255),
        (0, 0, 0),
        (255, 0, 255)
    ]

    with open(fileName, 'w') as f:
        f.write('ply\n')
        f.write('format ascii 1.0\n')
        f.write('comment PCL generated\n')
        f.write('element vertex {}\n'.format(len(xyzs)))
        f.write('property float x\n')
        f.write('property float y\n')
        f.write('property float z\n')
        f.write('property uchar red\n')
        f.write('property uchar green\n')
        f.write('property uchar blue\n')
        f.write('end_header\n')
        for i in range(len(xyzs)):
            r, g, b = RGBS[int(labels[i])-1]
            x, y, z = xyzs[i]
            f.write('{} {} {} {} {} {}\n'.format(x, y, z, r, g, b))

if __name__ == "__main__":
    numpoints = 2000  # 2000个点
    xyzs = np.random.rand(numpoints, 3)
    labels = np.random.randint(0, 4, numpoints)  # 4种label
    makePlyFile(xyzs, labels, 'demo.ply')
    pcd = o3d.io.read_point_cloud('demo.ply')
    o3d.visualization.draw_geometries([pcd])

在这里插入图片描述

### 使用Open3D可视化PLY文件中的点云法线 为了使用Open3D库来可视化PLY文件中的点云及其法线,需先加载PLY文件计算其法线。一旦完成这些步骤,则可以通过设置参数使法线可见。 #### 加载PLY文件 通过`read_point_cloud()`函数读取PLY文件将其存储在一个变量中以便进一步处理[^4]。 ```python import open3d as o3d ply_file_path = 'path_to_your_ply_file.ply' point_cloud = o3d.io.read_point_cloud(ply_file_path) ``` #### 计算法线 对于某些PLY文件来说,可能已经包含了预计算好的法线;但对于那些没有提供法线信息的情况,或者想要重新计算更精确的法线时,可以调用`estimate_normals()`方法来进行估计。此过程涉及指定搜索半径以及最近邻的数量作为参数[^1]。 ```python # 设置搜索树 search_tree = o3d.geometry.KDTreeFlann(point_cloud) # 估算法线 point_cloud.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30)) ``` #### 可视化点云与法线 最后一步是利用`draw_geometries()`函数显示带有法线箭头指示方向的点云图像。默认情况下,法线不会自动展示出来,因此还需要额外配置以确保它们能够被看见。这通常涉及到调整相机角度和缩放级别等参数。 ```python o3d.visualization.draw_geometries( [point_cloud], zoom=0.7, front=[0.5439, -0.2333, -0.8060], lookat=[2.4615, 2.1331, 1.338], up=[-0.1781, -0.9708, 0.1608], point_show_normal=True # 显示法线 ) ``` 上述代码片段展示了如何加载一个PLY格式的点云模型、为其计算合适的法线向用户呈现最终效果的方法。值得注意的是,在实际应用过程中,具体的参数值可能会依据不同的场景需求而有所变化。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值