自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(110)
  • 资源 (1)
  • 收藏
  • 关注

原创 【C++PCL】点云处理误差RMSE值计算(XYZ)

见RMSE解释。

2024-07-07 10:07:34 92

原创 【C++PCL】点云处理误差RMSE值计算

均方根误差定义为:式中,n为对应点对的数量,Xi为配准后对应点之间的欧氏距离,Xi​^​为对应点之间欧氏距离的真值。绝对理想状态下,完全配准后对应点之间的距离为0,因此对应点之间欧氏距离的真值为0。

2024-07-07 10:00:28 111

原创 【C++PCL】点云处理两组点云的最小距离

得到对应关系之后,将对应关系中最小的距离保留下来即为两点云的最小对应距离。

2024-07-06 21:26:42 39

原创 【C++PCL】点云处理误差MSE值计算

由于错误的配准效果点云空间位置相差较大,传统的均方根误差RMSE作为配准精度评定,限制最近点距离阈值会导致配准错误的点被剔除,从而得到较小的RMSE,错误点被剔除得到的RMSE值较小,但是配准效果并不理想。采用配准后点云对应的最近点距离的平方和作为配准效果的评定可以避免这种结果,配准得分指标是通过计算配准后对应点对之间的欧氏距离,再进行求和后除以配准点总数得到的平均距离差值,即为得分。pi为源点云的某一点,qi为目标点云相对于源点云pi的近邻点。

2024-07-06 21:26:19 37

原创 【C++PCL】点云处理点云对应点对的均值标准差

输入的是对应点对列表,:输出的是对应点对之间距离平方的均值和标准差。

2024-07-04 16:55:09 273

原创 【C++PCL】点云处理获取两点云的差异点云

初始化一个用于最近邻搜索的空间定位器(例如kd-tree),以便快速找到目标点云中与源点云点最接近的点。遍历源点云遍历源点云中的每个点,对于每个点,寻找目标点云中距离最近的点(最近邻)。最近邻搜索对于源点云中的每个点,使用空间定位器在目标点云中搜索最近邻点,并计算它们之间的距离。距离比较将计算出的最近邻距离与给定的距离阈值进行比较。如果距离大于阈值,说明这个源点云点在目标点云中没有找到足够近的对应点。存储不匹配点如果源点云中的点没有在目标点云中找到足够近的对应点,则将这个点存储到一个索引列表中。

2024-07-04 16:54:50 303

原创 【C++PCL】点云处理提取点云非重叠部分

对于每个源点,使用最近邻搜索找到其在目标点云中的最近邻点。检查距离是否在允许的最大距离阈值内。如果距离超出阈值,则跳过该点。对于找到的目标点,再在源点云中进行最近邻搜索,验证该目标点的最近邻是否回到原始源点。只有在双向验证通过的情况下,才认为这对点是有效的对应点对。

2024-06-30 14:04:43 30

原创 【C++PCL】点云处理提取点云重叠部分

对应关系估计器的主要任务是找到两个点云之间的匹配点对。最近邻搜索:对于源点云中的每个点,找到目标点云中距离最近的点。这通常使用KD树或其他高效的最近邻搜索算法来实现。互惠对应关系:不仅要找到源点云中的每个点在目标点云中的最近邻点,还要找到目标点云中的每个点在源点云中的最近邻点。如果这两个点互为最近邻点,则认为它们是一个有效的对应点对。距离过滤:应用距离阈值过滤,排除那些距离超过设定值的点对。这可以避免将不相关或噪声点对纳入考虑。

2024-06-30 14:04:20 153

原创 【C++PCL】点云处理八叉树混合邻域半径搜索

p_q (这是查询点的参数,即要查找邻居的起始点。radius (这是用来确定邻居点范围的球体的半径。只有距离查询点p_q在这个半径范围内的点会被返回。这是一个输出参数,用于存储找到的邻居点的索引值。函数执行后,这个向量会包含邻居点在数据集中的索引。这是另一个输出参数,用于存储找到的邻居点到查询点p_q的平方距离。平方距离比直接距离更有效地用于计算和比较。

2024-06-29 12:45:55 101

原创 【C++PCL】点云处理八叉树半径搜索

p_q (这是查询点的参数,即要查找邻居的起始点。radius (这是用来确定邻居点范围的球体的半径。只有距离查询点p_q在这个半径范围内的点会被返回。这是一个输出参数,用于存储找到的邻居点的索引值。函数执行后,这个向量会包含邻居点在数据集中的索引。这是另一个输出参数,用于存储找到的邻居点到查询点p_q的平方距离。平方距离比直接距离更有效地用于计算和比较。

2024-06-29 12:45:31 34

原创 【C++PCL】点云处理八叉树邻域搜索

int k,含义:给定的查询点,即需要寻找最近邻的点。解释:这是一个常量引用,指向查询点p_q。该查询点是在点云中寻找k个最近邻点的基础。int k含义:要搜索的邻居点的数量。解释:这是一个整数值,表示算法需要返回的最近邻点的个数,即k值。含义:邻居点的结果索引。解释:这是一个整数向量,存储k个最近邻点在点云中的索引。在调用函数前,这个向量必须被调整大小(resize)以容纳k个元素。含义:邻居点到查询点的平方距离。解释:这是一个浮点数向量,存储k个最近邻点到查询点的平方距离。

2024-06-28 10:58:13 149

原创 【C++PCL】点云处理八叉树原理

与KD树一样,八叉树(octree)也是一种高效的组织点云数据的办法,它可以从原始点云数据建树状数据结构。八叉树可以有效实现对点云的空间分区、下采样、搜索操作(如近邻搜索)等。每个八叉树要么有8个节点,要么没有节点。根节点是一个包含所有点云数据的立方体包围盒八叉树结构是由 Hunter博士于1978年首次提出的一种数据模型。八叉树结构通过对三维空间的几何实体进行体元剖分,每个体元具有相同的时间和空间复杂度。

2024-06-28 10:57:50 37

原创 【C++PCL】点云处理点云密度计算优化

目前,计算点云的密度方式为选择某区域内的点集合,记为Q;然后计算任意一点到最近邻域点距离,记为di;将Q内的点云的所有点对应的 相加取平均值,即优化版本的K最近邻点搜索的时候加入了距离约束条件,避免了空洞区域对整体密度的影响,鲁棒性更强。但是该方式计算点云密度时仍然容易产生较大的误差,如图所示,由于绿色点的影响,会导致计算的点云密度结果偏小。

2024-06-27 11:37:09 28

原创 【C++PCL】点云处理表面采样

空间划分: 算法首先在点云的空间范围内进行递归划分。计算点云中每个维度的最大值和最小值,确定整个点云的包围盒。选择一个划分维度(通常选择范围最大的维度),将点云在该维度上分为两半。对每一半递归进行同样的划分,直到每个分块中的点数小于或等于预设的样本数。采样对每个分块,根据设定的采样比例随机选择一部分点。计算所选点的法向量和曲率,并将这些信息附加到采样点上。法向量计算计算点的协方差矩阵和质心。求解协方差矩阵的特征值和特征向量,得到法向量和曲率。将法向量和曲率信息附加到采样点中。

2024-06-27 11:35:40 398

原创 【C++PCL】点云处理点云密度计算

目前,计算点云的密度方式为选择某区域内的点集合,记为Q;然后计算任意一点到最近邻域点距离,记为di;将Q内的点云的所有点对应的 相加取平均值,即该方式计算点云密度时容易产生较大的误差,如图所示,由于绿色点的影响,会导致计算的点云密度结果偏小。

2024-06-26 09:37:42 152

原创 【C++PCL】点云处理Kd树和八叉树区别

作者:迅卓科技简介:本人从事过多项点云项目,并且负责的项目均已得到好评!公众号:迅卓科技,一个可以让您可以学习点云的好地方。

2024-06-26 09:35:09 39

原创 【C++PCL】点云处理Kd-tree圆柱搜索

目标是执行圆柱形邻域搜索,需要将三维点云转换为二维形式。这通过将所有点的 z 坐标设置为零来实现,简化了后续的搜索过程。使用 pcl::KdTreeFLANN 类构建 kdtree 对象,并将之前准备的二维点云作为其输入数据。通过设定查询点和搜索半径,调用 radiusSearch 方法,可以找出所有位于指定半径内邻居的点。近邻搜索的结果包括每个邻近点的索引和与查询点的平方距离,这些信息存储在向量中。

2024-06-25 10:27:41 36

原创 【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 366

原创 【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 120

原创 【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 159

原创 【C++PCL】点云处理Kd-tree原理

kd-tree是散乱点云的一种储存结构,它是一种具有其他约束的二进位搜索树。kd-tree将点云有序的组合在一起,使其之间存在着特定关系,因此kd-tree对于范围搜索和临近搜索比较有意义。

2024-06-23 15:37:52 56

原创 【C++PCL】点云处理稳健姿态估计配准

点云加载: 从文件中加载源点云和目标点云,作为输入数据。下采样: 使用体素栅格滤波器对点云进行下采样,减少点的数量以提高计算效率。下采样通过将点云划分为固定大小的体素,然后用每个体素内的点的质心代替体素内所有点,从而减少点云的点数。

2024-06-23 15:23:02 135

原创 【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 62

原创 【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 587

原创 【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 52

原创 【C++PCL】点云处理投影滤波

PCL(Point Cloud Library)中的投影滤波器是一种用于将点云数据投影到特定几何形状上的算法。这种滤波器可以将点云数据投影到平面、球面、圆柱面等不同的表面上。投影滤波器的主要作用是将点云数据的三维信息简化为更易处理的二维信息,同时保留空间结构的特征。以下是投影滤波器的原理介绍:1. 投影平面滤波器(Project Inliers)是将点云投影到一个平面上。选择投影平面:通过指定平面的法向量和一个平面上的点确定投影平面。计算投影点:对于点云中的每一个点,计算其在指定平面上的投影位置。

2024-06-06 09:37:29 40

原创 【C++PCL】点云处理正态分布变换(NDT)配准

正态分布变换(NDT)算法是一种很有用途的点云配准方法,是一个一次性初始化工作,不需要消耗大量的代价计算最近邻搜索匹配点,并且概率密度函数在两幅图像采集之间的额时间可以离线计算出来,但仍在存在的问题很多,包括收敛域差、NDT代价函数的不连续性以及稀疏室外环境下不可靠的姿态估计等。NDT算法的步骤:(1) 该算法的第一步是将扫描占用的空间细分为单元格网格(2D图像中的正方形或3D中的立方体),基于单元内的点分布计算每个单元的PDF。每个单元格中的PDF可以解释为单元格内表面点x^的生成过程。

2024-06-06 09:35:27 66

原创 【C++PCL】点云处理KD-ICP配准

ICP算法中最耗时的一步是搜索每个点的最近邻点,若使用穷举法进行搜索,时间复杂度会极大增加,从而降低整个点云配准的效率。为了解决这个问题,可以采用KD树(k-dimensionaltree)进行点云搜索。KD树是一种特殊的二叉树结构,其中k表示每个数据点的空间维度,对于三维点云数据来说k为3。KD树的构建过程如下:首先,在每个维度上计算数据点的方差,找到方差最大的维度作为分割空间的参考维度,以保证KD树的空间平衡;

2024-06-05 11:38:40 169

原创 【C++PCL】点云处理GICP配准

广义迭代最近点(Generalized-ICP,简称GICP)算法是在经典ICP算法基础上结合概率模型改进而来的一种点云配准算法。与经典ICP算法相比,GICP算法具有更广泛的适用性,但是在点云配准方面需要更多的时间。此外,针对稠密点云的配准效率和精度都有所提升。GICP算法的主要改进点有两个:首先,它改进了对应点对的确定式,通过考虑不确定性并使用概率模型来确定对应点对;其次,它改进了目标函数的求解方法,使用高斯分布来描述点云的分布,进而优化点云的匹配。

2024-06-05 11:03:25 253

原创 【C++PCL】点云处理ICP配准

ICP算法是一种点云配准算法,通过将待配准点云空间坐标转换到目标点云空间坐标系中,实现点云精确配准的目的。该算法的核心思想:首先,寻找待配准点云和目标点云之间的对应点对集合;然后,利用四元数法求取刚体变换矩阵,以实现对待配准点云的空间位置进行更新;最后,通过反复迭代更新待配准点云的位置,直到满足设定的阈值或迭代次数上限,从而实现点云配准。ICP算法的计算复杂度较高,但可以达到较高的精度和鲁棒性。假设待配准点云P和目标点云Q,数目分别为NM。令最大迭代次数为K。

2024-06-04 18:01:11 164

原创 【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 204

原创 【C++PCL】点云处理SUSAN关键点提取

/ 加载点云PCL_ERROR("加载点云失败\n");return -1;// SUSAN角点检测// 设置输入点云// 设置邻域搜索的方式// 设置多线程加速的线程数// 设置法向量估计和非极大值抑制的半径// 设置距离阈值// 设置用于角点检测的角度阈值// 设置用于角点检测的强度阈值// 对响应应用非最大值抑制,以保持最强角// 保存角点到PCD文件return 0;

2024-05-10 09:59:32 59

原创 【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 271

原创 【C++PCL】点云处理ISS关键点提取

ISS是一种表示立体几何形状的方法,该算法含有丰富的几何特征信息,可以应用在高质量的点云配准中。设点云P中含有n个点(xi,yi,zi),设pi=(xi,yi,zi),提取关键点具体流程如下:(1) 对点云P中每个点pi建立局部坐标系,并对所有点设置搜索半径;(2) 确定点云P中每个以pi为中心,r为半径区域内的所有点,并计算这些点的权值,其表达式为下式:通过下式计算每个点pi的协方差矩阵:计算每个点pi的协方差矩阵的特征值并按从大到小的顺序排列得到设定阈值和。

2024-05-08 11:47:08 146

原创 【C++PCL】点云处理RoPS描述符

计算RoPS关键点,根据支持半径裁剪局部表面,因此只考虑位于内部的点和三角形,然后,计算局部参考帧(LRF),赋予描述符旋转不变性。创建一个坐标系,以该点为原点,轴与LRF对齐。然后,对于每个轴,执行几个步骤。首先,局部曲面围绕当前轴旋转。角度由其中一个参数决定,该参数设置旋转的次数。然后,将局部曲面中的所有点投影到XY、XZ和YZ平面上。对于每一个,计算关于投影点分布的统计信息,并连接以形成最终的描述符。详细步骤如下:解释一:有了一个网格和一组必须计算特征的点,执行一些简单的步骤。

2024-05-06 15:43:48 44

原创 【C++PCL】点云处理ESF描述符

ESF描述符是10个64大小的形状函数直方图的集合,一种基于描述部分点云表面距离、角度和面积分布的三种不同形状函数的全局形状描述子。D2形状分布可以区分粗糙的形状,但是一旦类的数量增加,只有对象的部分视图可用,则此特征的描述能力就不再足够了。在3D机械零件的背景下扩展了D2形状分布,将两个随机采样点创建的每条线分类为3D模型内部、外部或两者的混合。这种方法适用于部分点云。两个随机采样点之间的线被分类为点云表面的开/离。

2024-05-06 12:57:13 157

原创 【C++PCL】点云处理SHOT描述符

SHOT(Signature of Histogram of OrienTations)是签名的方向直方图的简称,它是由Tombari和Salti等人提出的一种局部特征描述子。该描述子对关键点附近某个邻域内不同空间位置分布的点的表面法线的特征进行统计并生成直方图。首先,在关键点p上建立一个局部坐标系(LocalReferenceFrame,LRF)并将其支撑区域中的相邻点与LRF对齐。接下来,采用基于签名的原理把点云的空间位置信息统计于空间的32个网格中。

2024-04-30 11:56:40 58

原创 【C++PCL】点云处理VFH描述符

VFH即视点特征直方图,它基于局部特征FPFH,在保持特征缩放不变性的同时统计视点信息,使其可以区分物体不同的姿态。

2024-04-18 15:17:55 63

原创 隧道裂缝检测

探讨了隧道点云中裂缝的识别和描述。通过分析点云数据,详细研究了裂缝的位置、形状和大小等特征。目标是提供准确的裂缝信息,以支持隧道结构的监测和维护工作。这些数据有助于及时发现裂缝问题,并采取相应的修复措施,确保隧道的安全运营。

2024-04-18 10:53:55 278

原创 隧道器材检测

专注于隧道点云中器材的分析。通过对点云数据的观察和分析,致力于准确识别和描述隧道中存在的各种器材。研究旨在为隧道设备管理和维护提供有效的数据支持,以确保隧道运营的安全和高效。

2024-04-18 10:46:16 255

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除