ply点云文件读取并计算法线向量


前言

最近在做点云数据的处理,记录一些点云的处理方法

一、点云读取

plyfile读取点云

import plyfile

def readPly(ply_file):
    plydata = plyfile.PlyData.read(ply_file)
    # 提取顶点坐标和颜色信息
    vertices = []
    for vertex in plydata['vertex']:
        x, y, z = vertex['x'], vertex['y'], vertex['z']
        red, green, blue = int(vertex['red']), int(vertex['green']), int(vertex['blue'])
        vertices.append({'x': x, 'y': y, 'z': z, 'red': red, 'green': green, 'blue': blue})
    point_cloud_positions = np.array([[vertex['x'], vertex['y'], vertex['z'], 1] for vertex in vertices])
    point_cloud_colors = np.array(
        [[int(vertex['red']), int(vertex['green']), int(vertex['blue'])] for vertex in vertices])
    return point_cloud_positions, point_cloud_colors

open3d读取点云

import open3d as o3d

import open3d as o3d

pcd = o3d.io.read_point_cloud("point_cloud.ply")

pcd是open3d里面的PointCloud 对象,属性有:
points:点云的点坐标数据,类型为 open3d.utility.Vector3dVector。
colors:点云的颜色数据,类型为 open3d.utility.Vector3dVector。
normals:点云的法向量数据,类型为 open3d.utility.Vector3dVector。
has_points():检查点云是否具有点数据。
has_colors():检查点云是否具有颜色数据。
has_normals():检查点云是否具有法向量数据。
is_empty():检查点云是否为空。

二、点云的法向量计算

使用k近邻估计法向量

代码如下:

pcd_knn = o3d.geometry.PointCloud()
pcd_knn.points = o3d.utility.Vector3dVector(point_cloud_positions)
pcd_knn.colors = o3d.utility.Vector3dVector(point_cloud_colors)
pcd_knn.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamKNN(knn=20))

使用半径近邻估计法向量

代码如下:

pcd_radius = o3d.geometry.PointCloud()
pcd_radius.points = o3d.utility.Vector3dVector(point_cloud_positions)
pcd_radius.colors = o3d.utility.Vector3dVector(point_cloud_colors)
pcd_radius.estimate_normals(
    search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=20))

使用混合搜索估计法向量

代码如下:

pcd_hybrid = o3d.geometry.PointCloud()
pcd_hybrid.points = o3d.utility.Vector3dVector(point_cloud_positions)
pcd_hybrid.colors = o3d.utility.Vector3dVector(point_cloud_colors)
pcd_hybrid.estimate_normals(
        search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.2, max_nn=20))

总结

以上是点云的一些简单处理代码,后续会持续记录。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值