搜索点云一定半径内的邻域点+可视化[Open3D-Python]

import open3d as o3d

# 计算法线,搜索半径0.01m,只考虑邻域内30个点
if __name__ == "__main__":
    ply = o3d.io.read_point_cloud("bunny.ply", 'auto', True, True)
    ply.paint_uniform_color([0, 0, 1])

    ply.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=30))
    o3d.visualization.draw_geometries([ply], mesh_show_back_face=False, window_name='Open3d', width=1200, height=1200,
                                      point_show_normal=True)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
点云处理中,检测边界是一项重要的任务。其中一种方法是通过比较每个的法向量与其邻域的法向量之间的夹角来标记边界。如果夹角很大,则可以将该标记为边界。下面是一些示例 MATLAB 代码,演示如何使用 PCA 算法来计算点云的法向量,并使用夹角方法检测边界。 ```matlab % 读取点云数据 ptCloud = pcread('pointCloud.ply'); % 计算点云的法向量 normalVector = pcnormals(ptCloud); % 设置邻域的数量 neighborhoodSize = 10; % 初始化边界索引 boundaryIndices = []; % 遍历每个 for i = 1:ptCloud.Count % 获取当前的法向量 currentNormal = normalVector(i,:); % 获取当前邻域 [indices,~] = findNeighborsInRadius(ptCloud,ptCloud.Location(i,:),neighborhoodSize); % 计算邻域的法向量 neighborNormals = normalVector(indices,:); % 计算当前的法向量与邻域法向量的夹角 angles = acosd(dot(repmat(currentNormal,[size(neighborNormals,1),1]),neighborNormals,2)); % 如果夹角大于阈值,则将该标记为边界 if any(angles > 90) boundaryIndices = [boundaryIndices,i]; end end % 将边界可视化 figure pcshow(ptCloud.Location,'MarkerSize',30) hold on plot3(ptCloud.Location(boundaryIndices,1),ptCloud.Location(boundaryIndices,2),ptCloud.Location(boundaryIndices,3),'r.','MarkerSize',50) title('Boundary Points Detection') xlabel('X') ylabel('Y') zlabel('Z') ``` 在上面的代码中,我们首先读取点云数据,并使用 `pcnormals` 函数计算点云的法向量。然后,我们设置邻域的数量,并遍历每个。对于每个,我们获取其邻域,并计算其法向量与邻域法向量之间的夹角。如果夹角大于 90 度,则将该标记为边界。最后,我们将边界可视化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值