3D点云法向量估计(最小二乘拟合平面)

本文详细介绍了点云法向量估计的主要思路,包括K-近邻平面拟合、最小二乘法转换为求协方差矩阵最小特征值对应特征向量的过程,以及如何通过SVD分解实现鲁棒性估计。同时,探讨了点云局部参考坐标系Z轴的求解方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、点云法向量估计的主要思路是对K-近邻的N个点进行平面拟合(平面过N点重心),平面法向量即为所求;

2、最小二乘拟合可以转换为求协方差矩阵最小特征值对应的特征向量(SVD分解);此种解法对数据噪声有很强的鲁棒性,关键点在于要对数据去中心化处理,将坐标原点移动到数据重心

3、最后根据特征点P到重心Oi形成的向量与法向量的点乘来判断法向量正负,f(p) < 0为负,f(p) > 0为正

4、代码撰写很简单,参考文章里面有,可以搬运。SVD可以调用Eigen或者Opencv。

5、网上找的一些资料均没有过程的详细推导,只有最终的类似2的结论,因此本文对证明过程进行详细推导,点云局部参考坐标系(Local Reference Frame)Z轴也是此种求法。

6、参考文章:

点云法向量估计Paper : http://hhoppe.com/recon.pdf

Hoppe, H., DeRose, T., Duchamp, T., McDonald, J. and Stuetzle, W. (1992). Surface reconstruction from unorganized points. ACM SIGGRAPH Computer Graphics, 26(2), pp.71-78. 

最小二乘拟合平面 http://www.ilikebigbits.com/2017_09_25_plane_from_points_2.html

PCA与SVD关系 https://www.cnblogs.com/BellaVita/p/10003864.html 

转载于:https://www.cnblogs.com/BellaVita/p/10003528.html

Hi~ 可私信我了解后再进行下载~ 1.基于halcon算法平台; 2.提供深度图源文件以及解压密码; 3.代码预览: */********************************* * @文档名称: 基于点云平面拟合。 * @作者: hugo * @版本: 1.1 * @日期: 2021-6-16 * @描述: 该方法支持点云平面拟合以及深度图平面拟合。 **********************************/* read_image (imageReal, './replay_38893_2021-6-7.tif') xResolution:=0.06 yResolution:=0.06 zResolution:=0.001 ScaleFactor:=[xResolution,yResolution,zResolution] rateLowRemove:=0.1 rateHighRemove:=0.1 dev_get_window (WindowHandle) *采样区域1 create_drawing_object_rectangle2 (300, 120, rad(90), 30, 20, DrawID) set_drawing_object_params (DrawID, 'color', 'red') set_drawing_object_params (DrawID, 'line_width', 1) attach_drawing_object_to_window (WindowHandle, DrawID) ......... TransPose := [0,0,d,0,0,0,0] rigid_trans_object_model_3d (SampledObjectModel3D1, TransPose, _SampledObjectModel3D1) rigid_trans_object_model_3d (ObjectModelPlane1, TransPose, _ObjectModelPlane1) create_pose (0, 0, Mean/2, 180, 0, 0, 'Rp+T', 'gba', 'point', Pose1) *visualize_object_model_3d (WindowHandle, [_ObjectModelPlane1,_SampledObjectModel3D1,SampledObjectModel3D2], [], [Pose1], [], ['intensity','lut','lut'], ['&amplitude','sqrt','sqrt'], '', 'Edited by AmazingRobot+ ' , PoseOut) visParamName := ['intensity_1','color_0','color_2','alpha_0'] visParamValue := ['coord_z','red','yellow',0.5] visualize_object_model_3d (WindowHandle, [_SampledObjectModel3D1,SampledObjectModel3D2,_ObjectModelPlane1], [], [], visParamName, visParamValue, 'Edited by AmazingRobot+', [], '', PoseOut) stop () 谢谢您的信任~
### 移动最小二乘法点云进行降采样的实现 对于点云数据处理中的降采样操作,移动最小二乘法(MLS, Moving Least Squares)是一种有效的方法。这种方法不仅能够减少点的数量,还能保持原始几何特征。 #### MLS算法原理概述 移动最小二乘法的核心在于局部多项式逼近,在每一个查询位置处构建一个加权最小平方差模型来估计新样本的位置。具体来说,给定一组离散的数据点P={pi}及其对应的权重wi(pi),目标是在任意一点q附近寻找最佳拟合曲线f(q)[^1]。 #### Python代码示例:基于Open3D库的应用程序 下面是一个简单的Python脚本,展示了如何利用开源计算机视觉库`open3d`来进行点云的MLSD下采样: ```python import open3d as o3d import numpy as np def mls_downsample(pcd, radius=0.05): """ 使用移动最小二乘法对输入点云pcd执行降采样. 参数: pcd (o3d.geometry.PointCloud): 输入点云对象 radius (float): 邻域半径参数 返回: down_pcd (o3d.geometry.PointCloud): 下采样后的点云 """ # 创建KDTree用于快速查找邻近点 tree = o3d.geometry.KDTreeFlann(pcd) points = [] colors = [] for i in range(len(np.asarray(pcd.points))): [k, idx, _] = tree.search_radius_vector_3d( pcd.points[i], radius) if k >= 3: # 至少有三个邻居才能做平面拟合 neighborhood_points = np.array([np.asarray(pcd.points[j]) for j in idx]) A = np.hstack((neighborhood_points, np.ones((len(neighborhood_points), 1)))) b = np.linalg.lstsq(A, np.zeros_like(idx))[0][:3] points.append(b.tolist()) color_avg = np.mean([pcd.colors[j] for j in idx], axis=0).tolist() colors.append(color_avg) down_pcd = o3d.geometry.PointCloud() down_pcd.points = o3d.utility.Vector3dVector(points) down_pcd.colors = o3d.utility.Vector3dVector(colors) return down_pcd if __name__ == "__main__": source_cloud = o3d.io.read_point_cloud("path_to_your_file.ply") result_cloud = mls_downsample(source_cloud) o3d.visualization.draw_geometries([result_cloud]) ``` 此段代码实现了基本的功能框架,实际应用中可能还需要考虑更多细节优化以及性能提升措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值