文章目录
前言
最近在做点云数据的处理,记录一些点云的处理方法
一、点云读取
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))
总结
以上是点云的一些简单处理代码,后续会持续记录。