- 博客(117)
- 资源 (1)
- 收藏
- 关注
原创 【C++PCL】法向量求解基于局部表面拟合
Hoppeetal.(1992)提出了基于局部表面拟合的法向量估计方法,在进行法向量估计时有一个基本假设,即点云表面处处光滑,如此可利用一个平面对某一点的邻域点进行拟合。对于一个空间点p,邻域点搜索时主要有两种方式,一种是选择距离p点最近的k个点,另一种设置一个距离阈值r,所有距离p点距离小于等于r的点被认为是其邻域点。邻域点搜索完成后,p点对应的局部平面P可表示如下:其中,n为拟合平面P的法向量,d为P到坐标原点的距离。
2025-02-18 21:42:20
32
原创 【C++PCL】点云处理MC移动立方体重建
移动立方体重建算法为等值面提取算法。该算法和体重建一样有基于图像和基于点云两种。基于图像的移动立方体算法其原理是将三维数据划分为一组立方体单元,然后通过对每个立方体单元内部的数据进行插值,并利用三角化技术来生成此单元内部的连续三角片。将预处理的图像读取到内存中;按照体元扫描2个切片;确定每个体元的顶点值并标记,通过标记进行体元连接情况归类;通过线性插值计算得到三角面片顶点的确切位置;计算每个体元顶点的单位法线,并将法线插值到三角形面片的每个顶点;输出重建模型。
2025-02-17 22:19:56
29
原创 【C++PCL】点云处理泊松曲面重建
泊松曲面重建(poisson surface reconstruction)算法是一种隐式函数的曲面重建算法,因其是经过最优插值的方法来对模型曲面进行拟合,所以拟合的结果存在误差。其重建过程为:首先输入的数据为具有法向量信息的点云数据ε,假设点云中的点全部附着于曲面M或者曲面M邻近区域,然后根据曲面M的指示函数和梯度两个参数之间的关系,建立泊松方程,根据泊松方程使用Marching Cubes(MC)等值面提取方法,将点云数据转化为曲面模型的表示形式,最终得到一个重建的曲面。1. 定义函数空间。
2025-02-16 16:26:11
37
原创 【C++PCL】点云处理RGB绿色过滤
在三维点云数据处理中,过滤 RGB 颜色信息(如去除绿色成分)可以帮助我们聚焦于感兴趣的部分。三维点云的每个点包含(x, y, z)坐标和 RGB 颜色信息。通过对颜色数据进行筛选,可以忽略特定颜色的信息,比如去除绿色的点以突出其他物体。G(绿色通道)被放大,突出绿色点的特征。R(红色通道)和B(蓝色通道)被减去,抑制非绿色点的影响。结果:通过对每个点的颜色进行计算,如果结果为负或为 0,可以忽略这些点,即去除绿色。
2024-10-20 13:25:40
117
原创 钢筋点云提取
该项目主要是处理采集的钢筋混凝土点云,首先将地面去除,然后按照聚类等方式进行处理,最终实现每根钢筋的分离和分割,以及计算每条钢筋之间的距离和夹角。
2024-08-25 16:25:11
492
5
原创 【C++PCL】点云处理贪婪三角化曲面重建
原理是将三维点云投影到某一平面上,然后对平面上的点云做平面区域的三角化,从而获取各个点之间的链接关系,其中平面区域三角化使用三角剖分算法(Delaunay),选取一个三角形作为初始曲面,通过对曲面的不断扩张从而形成一个完整的三角网格,根据投影点间的链接关系确定三维点云之间的拓扑关系,所获的空间三角网格即为曲面重建后的曲面模型,见图1。
2024-08-25 15:39:15
354
原创 【C++PCL】点云处理a-shape曲面重建
Alpha形状概念:Alpha形状是由Edelsbrunner等人在1983年提出的,是Delaunay三角化的一种推广。它通过控制一个参数α来生成一系列的形状,从而捕捉点云的几何特征,步骤如下:首先,对点云进行Delaunay三角剖分。Delaunay三角剖分是一个三角网格,它满足“空圆”性质,即每个三角形的外接圆中不包含其他点。通过设置参数α,过滤掉Delaunay三角剖分中的某些边和三角形,只保留那些边长和三角形边长平方和小于α的部分。这个过程生成了一个子集,称为Alpha形状。
2024-07-22 21:03:05
228
原创 【C++PCL】点云处理误差RMSE值计算
均方根误差定义为:式中,n为对应点对的数量,Xi为配准后对应点之间的欧氏距离,Xi^为对应点之间欧氏距离的真值。绝对理想状态下,完全配准后对应点之间的距离为0,因此对应点之间欧氏距离的真值为0。
2024-07-07 10:00:28
249
原创 【C++PCL】点云处理误差MSE值计算
由于错误的配准效果点云空间位置相差较大,传统的均方根误差RMSE作为配准精度评定,限制最近点距离阈值会导致配准错误的点被剔除,从而得到较小的RMSE,错误点被剔除得到的RMSE值较小,但是配准效果并不理想。采用配准后点云对应的最近点距离的平方和作为配准效果的评定可以避免这种结果,配准得分指标是通过计算配准后对应点对之间的欧氏距离,再进行求和后除以配准点总数得到的平均距离差值,即为得分。pi为源点云的某一点,qi为目标点云相对于源点云pi的近邻点。
2024-07-06 21:26:19
156
原创 【C++PCL】点云处理获取两点云的差异点云
初始化一个用于最近邻搜索的空间定位器(例如kd-tree),以便快速找到目标点云中与源点云点最接近的点。遍历源点云遍历源点云中的每个点,对于每个点,寻找目标点云中距离最近的点(最近邻)。最近邻搜索对于源点云中的每个点,使用空间定位器在目标点云中搜索最近邻点,并计算它们之间的距离。距离比较将计算出的最近邻距离与给定的距离阈值进行比较。如果距离大于阈值,说明这个源点云点在目标点云中没有找到足够近的对应点。存储不匹配点如果源点云中的点没有在目标点云中找到足够近的对应点,则将这个点存储到一个索引列表中。
2024-07-04 16:54:50
466
原创 【C++PCL】点云处理提取点云非重叠部分
对于每个源点,使用最近邻搜索找到其在目标点云中的最近邻点。检查距离是否在允许的最大距离阈值内。如果距离超出阈值,则跳过该点。对于找到的目标点,再在源点云中进行最近邻搜索,验证该目标点的最近邻是否回到原始源点。只有在双向验证通过的情况下,才认为这对点是有效的对应点对。
2024-06-30 14:04:43
118
原创 【C++PCL】点云处理提取点云重叠部分
对应关系估计器的主要任务是找到两个点云之间的匹配点对。最近邻搜索:对于源点云中的每个点,找到目标点云中距离最近的点。这通常使用KD树或其他高效的最近邻搜索算法来实现。互惠对应关系:不仅要找到源点云中的每个点在目标点云中的最近邻点,还要找到目标点云中的每个点在源点云中的最近邻点。如果这两个点互为最近邻点,则认为它们是一个有效的对应点对。距离过滤:应用距离阈值过滤,排除那些距离超过设定值的点对。这可以避免将不相关或噪声点对纳入考虑。
2024-06-30 14:04:20
272
原创 【C++PCL】点云处理八叉树混合邻域半径搜索
p_q (这是查询点的参数,即要查找邻居的起始点。radius (这是用来确定邻居点范围的球体的半径。只有距离查询点p_q在这个半径范围内的点会被返回。这是一个输出参数,用于存储找到的邻居点的索引值。函数执行后,这个向量会包含邻居点在数据集中的索引。这是另一个输出参数,用于存储找到的邻居点到查询点p_q的平方距离。平方距离比直接距离更有效地用于计算和比较。
2024-06-29 12:45:55
172
原创 【C++PCL】点云处理八叉树半径搜索
p_q (这是查询点的参数,即要查找邻居的起始点。radius (这是用来确定邻居点范围的球体的半径。只有距离查询点p_q在这个半径范围内的点会被返回。这是一个输出参数,用于存储找到的邻居点的索引值。函数执行后,这个向量会包含邻居点在数据集中的索引。这是另一个输出参数,用于存储找到的邻居点到查询点p_q的平方距离。平方距离比直接距离更有效地用于计算和比较。
2024-06-29 12:45:31
122
原创 【C++PCL】点云处理八叉树邻域搜索
int k,含义:给定的查询点,即需要寻找最近邻的点。解释:这是一个常量引用,指向查询点p_q。该查询点是在点云中寻找k个最近邻点的基础。int k含义:要搜索的邻居点的数量。解释:这是一个整数值,表示算法需要返回的最近邻点的个数,即k值。含义:邻居点的结果索引。解释:这是一个整数向量,存储k个最近邻点在点云中的索引。在调用函数前,这个向量必须被调整大小(resize)以容纳k个元素。含义:邻居点到查询点的平方距离。解释:这是一个浮点数向量,存储k个最近邻点到查询点的平方距离。
2024-06-28 10:58:13
258
原创 【C++PCL】点云处理八叉树原理
与KD树一样,八叉树(octree)也是一种高效的组织点云数据的办法,它可以从原始点云数据建树状数据结构。八叉树可以有效实现对点云的空间分区、下采样、搜索操作(如近邻搜索)等。每个八叉树要么有8个节点,要么没有节点。根节点是一个包含所有点云数据的立方体包围盒八叉树结构是由 Hunter博士于1978年首次提出的一种数据模型。八叉树结构通过对三维空间的几何实体进行体元剖分,每个体元具有相同的时间和空间复杂度。
2024-06-28 10:57:50
171
原创 【C++PCL】点云处理点云密度计算优化
目前,计算点云的密度方式为选择某区域内的点集合,记为Q;然后计算任意一点到最近邻域点距离,记为di;将Q内的点云的所有点对应的 相加取平均值,即优化版本的K最近邻点搜索的时候加入了距离约束条件,避免了空洞区域对整体密度的影响,鲁棒性更强。但是该方式计算点云密度时仍然容易产生较大的误差,如图所示,由于绿色点的影响,会导致计算的点云密度结果偏小。
2024-06-27 11:37:09
111
原创 【C++PCL】点云处理表面采样
空间划分: 算法首先在点云的空间范围内进行递归划分。计算点云中每个维度的最大值和最小值,确定整个点云的包围盒。选择一个划分维度(通常选择范围最大的维度),将点云在该维度上分为两半。对每一半递归进行同样的划分,直到每个分块中的点数小于或等于预设的样本数。采样对每个分块,根据设定的采样比例随机选择一部分点。计算所选点的法向量和曲率,并将这些信息附加到采样点上。法向量计算计算点的协方差矩阵和质心。求解协方差矩阵的特征值和特征向量,得到法向量和曲率。将法向量和曲率信息附加到采样点中。
2024-06-27 11:35:40
479
原创 【C++PCL】点云处理点云密度计算
目前,计算点云的密度方式为选择某区域内的点集合,记为Q;然后计算任意一点到最近邻域点距离,记为di;将Q内的点云的所有点对应的 相加取平均值,即该方式计算点云密度时容易产生较大的误差,如图所示,由于绿色点的影响,会导致计算的点云密度结果偏小。
2024-06-26 09:37:42
260
原创 【C++PCL】点云处理Kd树和八叉树区别
作者:迅卓科技简介:本人从事过多项点云项目,并且负责的项目均已得到好评!公众号:迅卓科技,一个可以让您可以学习点云的好地方。
2024-06-26 09:35:09
179
原创 【C++PCL】点云处理Kd-tree圆柱搜索
目标是执行圆柱形邻域搜索,需要将三维点云转换为二维形式。这通过将所有点的 z 坐标设置为零来实现,简化了后续的搜索过程。使用 pcl::KdTreeFLANN 类构建 kdtree 对象,并将之前准备的二维点云作为其输入数据。通过设定查询点和搜索半径,调用 radiusSearch 方法,可以找出所有位于指定半径内邻居的点。近邻搜索的结果包括每个邻近点的索引和与查询点的平方距离,这些信息存储在向量中。
2024-06-25 10:27:41
116
原创 【C++PCL】点云处理Kd-tree混合邻域半径搜索
在给定半径内搜索查询点的所有最近的邻居。该方法不会对输入索引(i.e., index >= cloud.size () || index < 0), 做任何边界检查,并假设数据有效(即有限)。point:一个给定的有效(即有限)查询点radius:包围p_q所有邻居的球面半径k_indices:相邻点的合成指数:到相邻点的平方距离max_nn:如果给定,则返回半径范围内搜索到的邻居的个数限定为这个值。如果max_nn设置为0或大于输入云中的点数,则返回半径内的所有邻居。
2024-06-25 10:26:07
446
原创 【C++PCL】点云处理Kd-tree半径搜索
在给定半径内搜索查询点的所有最近的邻居。该方法不会对输入索引(i.e., index >= cloud.size () || index < 0), 做任何边界检查,并假设数据有效(即有限)。point:一个给定的有效(即有限)查询点radius:包围p_q所有邻居的球面半径k_indices:相邻点的合成指数:到相邻点的平方距离max_nn:如果给定,则返回半径范围内搜索到的邻居的个数限定为这个值。如果max_nn设置为0或大于输入云中的点数,则返回半径内的所有邻居。
2024-06-24 14:39:38
209
原创 【C++PCL】点云处理Kd-tree邻域搜索
int k,为给定的查询点搜索k个最近邻。该方法不会对输入索引(i.e., index >= cloud.size () || index < 0), 做任何边界检查,并假设数据有效(即有限)。point:一个给定的有效(即有限)查询点k:要搜索的邻居数量k_indices:相邻点的合成指数(必须被预先调整为k!:到相邻点的平方距离(必须预先调整为k!
2024-06-24 13:05:36
244
原创 【C++PCL】点云处理Kd-tree原理
kd-tree是散乱点云的一种储存结构,它是一种具有其他约束的二进位搜索树。kd-tree将点云有序的组合在一起,使其之间存在着特定关系,因此kd-tree对于范围搜索和临近搜索比较有意义。
2024-06-23 15:37:52
218
原创 【C++PCL】点云处理稳健姿态估计配准
点云加载: 从文件中加载源点云和目标点云,作为输入数据。下采样: 使用体素栅格滤波器对点云进行下采样,减少点的数量以提高计算效率。下采样通过将点云划分为固定大小的体素,然后用每个体素内的点的质心代替体素内所有点,从而减少点云的点数。
2024-06-23 15:23:02
265
原创 【C++PCL】点云处理对称目标函数的ICP
因为曲面P和Q在噪声之前应该是相同的,所以考虑如果要对该曲面上的一对相邻点(p,q)进行采样,目标函数将获得多少残差。在点到平面的情况下,误差函数为:如果考虑在表面的某个小区域内的任何位置进行采样的可能性(p,q),则只有当表面完全平坦时,采样才会为零。但是,请考虑更对称的函数。检查该函数在二维中的行为(见图1),看到每当从圆中采样p和q时,它都是零,因为np和nq对p−q的投影相反。当刚体变换应用于P时,此表达式将继续计算只要p和q最终处于与它们在某个圆上的位置一致的相对位置,就为零(图2,顶部)。
2024-06-08 16:23:23
175
原创 【C++PCL】点云处理Trimmed_ICP配准
对于源点云P中点的个数不等目标点云Q点个数的两个点集,源点云中的一些点在目标点集中可能没有对应关系。假设可以配对的数据点的最小保证率为σ,那么,可以配对的数据点数量为Npo=σN当σ=1时就是ICP。(1)对于P的每个点,找出Q中最近的点,并计算各个点对之间的距离di²;(2)按升序排列,选择前Npo个点对并计算它们的和sum';(3)满足约束条件(与ICP相同)则退出,否则令sum=sum'并继续;(4)为选定的Npo对对应点对计算最小化sum'的最佳变换(R,T);(5)进行变换并循环。
2024-06-07 13:07:31
704
原创 【C++PCL】点云处理点到面ICP配准
点到点ICP的缺点在于配准结果容易受到点云中噪声的影响。为此,Chen等提出点到面的ICP(Point to Plane ICP)。在对应点选择方面,点到面ICP使用的仍然是目标点云中的最近顶点;但在误差度量函数方面,点到面ICP使用的是顶点到其对应点的切平面距离,而不是点到点ICP的两点间欧氏距离。图4-4和图4-5分别是点到点ICP和点到面ICP误差度量的示意图。点到面ICP的误差度量函数为:式中,T表示变换矩阵;pi、qi分别表示源点云与目标点云中的对应点;ni表示qi对应点的法向量。
2024-06-07 13:07:03
162
原创 【C++PCL】点云处理投影滤波
PCL(Point Cloud Library)中的投影滤波器是一种用于将点云数据投影到特定几何形状上的算法。这种滤波器可以将点云数据投影到平面、球面、圆柱面等不同的表面上。投影滤波器的主要作用是将点云数据的三维信息简化为更易处理的二维信息,同时保留空间结构的特征。以下是投影滤波器的原理介绍:1. 投影平面滤波器(Project Inliers)是将点云投影到一个平面上。选择投影平面:通过指定平面的法向量和一个平面上的点确定投影平面。计算投影点:对于点云中的每一个点,计算其在指定平面上的投影位置。
2024-06-06 09:37:29
125
原创 【C++PCL】点云处理正态分布变换(NDT)配准
正态分布变换(NDT)算法是一种很有用途的点云配准方法,是一个一次性初始化工作,不需要消耗大量的代价计算最近邻搜索匹配点,并且概率密度函数在两幅图像采集之间的额时间可以离线计算出来,但仍在存在的问题很多,包括收敛域差、NDT代价函数的不连续性以及稀疏室外环境下不可靠的姿态估计等。NDT算法的步骤:(1) 该算法的第一步是将扫描占用的空间细分为单元格网格(2D图像中的正方形或3D中的立方体),基于单元内的点分布计算每个单元的PDF。每个单元格中的PDF可以解释为单元格内表面点x^的生成过程。
2024-06-06 09:35:27
167
原创 【C++PCL】点云处理KD-ICP配准
ICP算法中最耗时的一步是搜索每个点的最近邻点,若使用穷举法进行搜索,时间复杂度会极大增加,从而降低整个点云配准的效率。为了解决这个问题,可以采用KD树(k-dimensionaltree)进行点云搜索。KD树是一种特殊的二叉树结构,其中k表示每个数据点的空间维度,对于三维点云数据来说k为3。KD树的构建过程如下:首先,在每个维度上计算数据点的方差,找到方差最大的维度作为分割空间的参考维度,以保证KD树的空间平衡;
2024-06-05 11:38:40
245
原创 【C++PCL】点云处理GICP配准
广义迭代最近点(Generalized-ICP,简称GICP)算法是在经典ICP算法基础上结合概率模型改进而来的一种点云配准算法。与经典ICP算法相比,GICP算法具有更广泛的适用性,但是在点云配准方面需要更多的时间。此外,针对稠密点云的配准效率和精度都有所提升。GICP算法的主要改进点有两个:首先,它改进了对应点对的确定式,通过考虑不确定性并使用概率模型来确定对应点对;其次,它改进了目标函数的求解方法,使用高斯分布来描述点云的分布,进而优化点云的匹配。
2024-06-05 11:03:25
424
原创 【C++PCL】点云处理ICP配准
ICP算法是一种点云配准算法,通过将待配准点云空间坐标转换到目标点云空间坐标系中,实现点云精确配准的目的。该算法的核心思想:首先,寻找待配准点云和目标点云之间的对应点对集合;然后,利用四元数法求取刚体变换矩阵,以实现对待配准点云的空间位置进行更新;最后,通过反复迭代更新待配准点云的位置,直到满足设定的阈值或迭代次数上限,从而实现点云配准。ICP算法的计算复杂度较高,但可以达到较高的精度和鲁棒性。假设待配准点云P和目标点云Q,数目分别为NM。令最大迭代次数为K。
2024-06-04 18:01:11
284
原创 【C++PCL】点云处理3D-SIFT关键点提取(Z方向梯度约束)
在3D(x、y、t)中,可以计算时空梯度(Lx,L−y,L−t),其中Lt近似为L(x,y,t+1)−L(x,y,t−1)。现在给出了3D中的梯度大小和方向可以看出,φ现在对远离2D梯度方向的角度进行编码。由于√L2x+L2y为正,φ将始终在(−π/2,π/2)范围内。这是期望的效果,使每个角度都由单个唯一(θ,φ)对表示。现在,每个像素都有两个值,分别表示三维渐变的方向。下一步是为给定兴趣点周围的3D邻域构建类似于的加权直方图。有多种方法可以实现此目的。
2024-05-10 11:00:47
375
原创 【C++PCL】点云处理SUSAN关键点提取
/ 加载点云PCL_ERROR("加载点云失败\n");return -1;// SUSAN角点检测// 设置输入点云// 设置邻域搜索的方式// 设置多线程加速的线程数// 设置法向量估计和非极大值抑制的半径// 设置距离阈值// 设置用于角点检测的角度阈值// 设置用于角点检测的强度阈值// 对响应应用非最大值抑制,以保持最强角// 保存角点到PCD文件return 0;
2024-05-10 09:59:32
126
原创 【C++PCL】点云处理3D-Harris关键点提取
3D-Harris算法通过对点云体素化,将其分割成一个个的方块体,并从前、后、左、右、上、下6个平移方向检测方块体内点云的数量变化来确定局部区域内是否存在关键点。该算法检测步骤如下:(1) 将点云体素化,建立局部坐标系,以法向量的方向为Z轴,X、Y轴与Z轴两两垂直,X轴方向在XOY平面内任意。(2) 建立KD-Tree,求解点云的法向量并构建法向量的协方差矩阵。协方差矩阵M的表达式为:其中,n为当前点的邻域点个数,nx、ny、nz分别为点云法向量的三个分量。
2024-05-08 16:49:55
376
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人