Open3D计算点云距离

Open3D计算点云距离
Open3D中的compute_point_cloud_distance函数计算从源点云中每个点到目标点云中最近邻点的距离。

import open3d as o3d
import numpy as np

# 读取点云
pcd1 = o3d.io.read_point_cloud("cloud_bin_0.pcd")
print(pcd1)
pcd2 = o3d.io.read_point_cloud("cloud_bin_1.pcd")
print(pcd2)
# 距离计算
dists = pcd1.compute_point_cloud_distance(pcd2)
dists = np.asarray(dists)
print()
print("前10个点的距离为:\n", dists[:10])
# 提取距离大于0.1的点
ind = np.where(dists > 0.1)[0]
pcd3 = pcd1.select_by_index(ind)
print(pcd3)
o3d.visualization.draw_geometries([pcd3], window_name="计算点云距离",
                                  width=800,  # 窗口宽度
                                  height=600)  # 窗口高度

在这里插入图片描述

Open3D 计算点云法向量

import open3d as o3d

# 读取点云
pcd = o3d.io.read_point_cloud("desk.pcd")
print(pcd)
# 法线估计
radius = 0.01  # 搜索半径
max_nn = 30  # 邻域内用于估算法线的最大点数
pcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius, max_nn))
o3d.visualization.draw_geometries([pcd], window_name="法线估计",
                                  point_show_normal=True,
                                  width=800,  # 窗口宽度
                                  height=600)  # 窗口高度

在这里插入图片描述

Open3D 点云分割
随机抽样一致性算法RANSAC(Random sample consensus)是一种迭代的方法来从一系列包含有离异值的数据中计算数学模型参数的方法。
RANSAC算法本质上由两步组成,不断进行循环:
从输入数据中随机选出能组成数学模型的最小数目的元素,使用这些元素计算出相应模型的参数。选出的这些元素数目是能决定模型参数的最少的。
检查所有数据中有哪些元素能符合第一步得到的模型。超过错误阈值的元素认为是离群值(outlier),小于错误阈值的元素认为是内部点(inlier)。
这个过程重复多次,选出包含点最多的模型即得到最后的结果。
RANSAC具体到空间点云中拟合平面:
1、从点云中随机选取三个点。
2、由这三个点组成一个平面。
3、计算所有其他点到该平面的距离,如果小于阈值T,就认为是处在同一个平面的点。
3、如果处在同一个平面的点超过n个,就保存下这个平面,并将处在这个平面上的点都标记为已匹配。
4、终止的条件是迭代N次后找到的平面小于n个点,或者找不到三个未标记的点。

import open3d as o3d

pcd = o3d.io.read_point_cloud("desk.pcd")
print(pcd)

distance_threshold = 0.2    # 内点到平面模型的最大距离
ransac_n = 3                # 用于拟合平面的采样点数
num_iterations = 1000       # 最大迭代次数

# 返回模型系数plane_model和内点索引inliers,并赋值
plane_model, inliers = pcd.segment_plane(distance_threshold, ransac_n, num_iterations)

# 输出平面方程
[a, b, c, d] = plane_model
print(f"Plane equation: {a:.2f}x + {b:.2f}y + {c:.2f}z + {d:.2f} = 0")
# 平面内点点云
inlier_cloud = pcd.select_by_index(inliers)
inlier_cloud.paint_uniform_color([0, 0, 1.0])
print(inlier_cloud)
# 平面外点点云
outlier_cloud = pcd.select_by_index(inliers, invert=True)
outlier_cloud.paint_uniform_color([1.0, 0, 0])
print(outlier_cloud)
# 可视化平面分割结果
o3d.visualization.draw_geometries([inlier_cloud, outlier_cloud])

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值