拟合平面点云

拟合平面点云

1.点云处理

point_cloud = o3d.geometry.PointCloud()  #创建点云对象point_cloud,用于存储和操作点云数据。
point_cloud.points = o3d.utility.Vector3dVector(xyz)  # 该函数用于将一维数组、列表或其他可迭代对象中的三维向量数据转换为Open3D库中定义的Vector3dVector类型。
# 剔除无效值
pcd1 = deepcopy(point_cloud)
pcd1 = pcd1.remove_non_finite_points(True, True)  # 剔除无效值

pcd2 = deepcopy(pcd1)
res = o3d.geometry.PointCloud.remove_statistical_outlier(pcd2,200, 0.5)  # 统计方法剔除

1.1 删除点云中无效的点

remove_non_finite_points(self, remove_nan=True, remove_infinite=True)

无效值包括空值和无限值。空值一般用NaN表示。 当remove_ nan为True时,剔除空值。当remove_ infinite为True时表示去除无限值。

1.2 统计方法剔除

open3d.geometry.PointCloud
remove_statistical_outlier(self, nb_neighbors, std_ratio, print_progress=False)

函数功能:删除距离其邻居较远的点
参数nb_neighbors (int):目标点周围的点数。它指定考虑多少邻居来计算给定点的平均距离;
std_ratio (float):标准差比率。它允许根据跨点云的平均距离的标准偏差设置阈值级别。这个数字越低,过滤器就越激进;
print_progress (bool, optional, default=False):设置为 True 以打印进度条。

原始点云图
请添加图片描述)
处理后点云图请添加图片描述

2.使用RANSAC算法拟合平面

plane_model, inliers = pcd2.segment_plane(distance_threshold=error_threshold,
                                                 ransac_n=outer_point,
                                                 num_iterations=max_iterations)

参数destance_threshold定义了一个点到一个估计平面的最大距离,这些距离内的点被认为是内点(inlier),ransac_n定义了使用随机抽样估计一个平面的点的个数,num_iterations定义了随机平面采样和验证的频率(迭代次数)。这个函数返回(a,b,c,d)作为一个平面,对于平面上每个点(x,y,z)我们有ax+by+cz+d=0。这个函数还会返回内点索引的列表。
plane_model返回a,b,c,d值
inliers返回inlier_cloud,outlier_cloud
:以RANSAC平面分割为例,由于三个可以确定一个平面, 因此RANSAC会随机选择三个点来构建一个平面, 并用点云中实际上有多少个点落到这个平面上来作为评估这个平面的正确程度。当随机抽样的次数足够多时,我们有较大概率获得所需要的平面。
请添加图片描述
inlier_cloud(内点)为红色,outlier_cloud(离群点)为绿色。

3.最小二乘法优化平面方程参数

def leastsq_plan(points):
    def planeerrors(para, points):
        """平面误差"""
        a0, a1, a2 = para
        return a0 * points[:, 0] + a1 * points[:, 1] + points[:, 2] + a2
    tparap = optimize.leastsq(planeerrors, [1, 1, 1], points)   
    para = tparap[0]
    return para

该函数使用优化后点云inlier_cloud拟合平面方程,找到最优的参数值a,b,c,d。
注:也可以使用SVD分解法求解平面点云-------》》》 链接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
点云RANSAC拟合平面是一种基于RANSAC(Random Sample Consensus)算法的方法,用于从三维点云中提取出一个平面模型。该方法的基本思想是通过随机采样一组点,拟合一个平面模型,并计算该模型与其他点之间的误差。根据误差的阈值,筛选出满足误差要求的内点,并将这些内点用于再次拟合平面模型。重复这个过程,直到达到停止条件,即提取出所有的平面。 在具体实现中,可以使用点云库PCL(Point Cloud Library)来进行RANSAC平面拟合。使用PCL中的函数可以方便地进行点云数据的读取和处理,以及进行RANSAC平面拟合。首先,从点云中随机选择一组点作为初始的内点集合,拟合一个平面模型。然后,计算其他点到该模型的距离,并根据阈值筛选出符合要求的内点。接着,使用筛选出的内点再次拟合新的平面模型。重复这个过程,直到满足停止条件,即提取出所有的平面模型。 通过RANSAC平面拟合,可以将三维不平整的表面近似为一个平面,并将表面上的点投影到该平面上,从而实现对点云数据平面化处理。这种方法可以广泛应用于计算机视觉、三维重建、机器人导航等领域。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [RANSAC点云平面拟合分割](https://blog.csdn.net/Subtlechange/article/details/123004329)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [PCL Ransac 点云平面拟合 C++](https://download.csdn.net/download/rocachilles/10974783)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值