open3d 顶点法线估计和获取
一、顶点法线估计
pcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30))
按下 N
键可以查看点法线。使用键 -
和 +
可以控制法线的长度。
函数原理
estimate_normals
函数为每个点计算法线。该函数查找相邻点,并使用协方差分析计算相邻点的主轴。该函数的参数是 KDTreeSearchParamHybrid
类的一个实例。两个关键参数 radius = 0.1
和 max_nn = 30
指定了搜索半径和最大最近邻。它有 10 厘米的搜索半径,并且只考虑最多 30 个邻居,以节省计算时间。
协方差分析算法产生了两个相反方向的法线候选方向。在不了解几何体的全局结构的情况下,这两个方向都可能是正确的。这被称为法线方向问题。如果存在原始法线,Open3D
尝试将法线定向与原始法线对齐。否则,Open3D
将进行随机猜测。如果方向是一个问题,需要调用进一步的方向函数,如 orient_normals_to_align_with_direction
和 orient_normals_towards_camera_location
。
参数解释
estimate_normals
函数用于估计点云中每个点的法线。它接受一个search_param
参数,该参数是一个o3d.geometry.KDTreeSearchParamHybrid
类的实例,用于指定搜索半径和最大最近邻点数量。
radius
参数指定了搜索半径,表示在这个半径范围内寻找邻近点用于法线估计。max_nn
参数指定了最大最近邻点数量,表示在搜索半径内最多考虑多少个邻近点。
二、获取估计的顶点法线
获得单个顶点法线
只能获得单个顶点法线pcd.normals[不超过数组长度的整数]
>>>print(pcd.normals[0])
[-0.22344398 -0.96962557 0.09949394]
获得多个顶点法线
法线向量可以使用 np.asarray
转换为 numpy
数组。
>>>print(np.asarray(pcd.normals)[:10])
[[-0.22344398 -0.96962557 0.09949394]
[-0.30282456 -0.91827757 0.25507564]
[-0.0930339 -0.77633579 -0.62341594]
[ 0.06452443 -0.96881599 -0.23923249]
[ 0.24771039 -0.96349484 0.10157387]
[ 0.1890532 -0.97541781 0.11322096]
[-0.26920394 -0.95010988 0.15754506]
[ 0.72941317 0.51298568 0.45255067]
[ 0.83949302 0.5402317 0.05831961]
[-0.32325253 0.62920765 0.7068278 ]]
获得数组前10个位置,只有x
轴,points[切片的起始位置:切片的截至位置, 获得轴(x:0, y:1 z:2)]
>>>print(points[:10, 0])
[-0.0378297 -0.0447794 -0.0680095 -0.00228741 -0.0226054 -0.0251078
-0.0371209 0.033213 0.0380425 -0.0255083 ]
三、点云数据获取
ope3d 官方文档:PointCloud - Open3D 0.18.0 documentation
点云数据:百度网盘链接:https://pan.baidu.com/s/1SDy8PCeQlj0EvZHj_f9XSA
提取码:yqny