自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(151)
  • 收藏
  • 关注

原创 条件欧几里得聚类

本教程介绍如何使用类:一种基于欧几里得距离和用户可自定义条件对点进行聚类的分割算法。此类使用与欧几里得聚类提取、区域增长分割和基于颜色的区域增长分割相同的贪婪/区域增长/洪水填充方法。与其他类相比,使用此类的优势在于用户现在可以自定义聚类约束(纯欧几里德、平滑度、RGB)。一些缺点包括:没有初始播种系统,没有过度和不足分割控制,以及从主计算循环内部调用条件函数的时间效率较低。源码:创建:conditional_euclidean_clustering.cpp 文件说明:1、头文件2、建立对象

2022-07-02 11:17:41 1046 2

原创 pcl基于最小切割的点云分割

在本教程中,我们将学习如何使用中实现的基于最小切的分割算法。该算法对给定的输入云进行二进制分割。根据对象中心及其半径,该算法将点云划分为两组:前景点和背景点(属于对象的点和不属于对象的点)。源码: 创建 min_cut_segmentation.cpp 文件说明:1、相关头文件2、从 .pcd 文件加载点云。3、表明类可以使用索引。这里,只选择有效点进行分割。4、类实例化。模板类只有一个参数 - PointT - 说明将使用哪种类型的点。5、提供了必须分割的点云和索引。6

2022-07-01 11:28:29 620

原创 pcl基于颜色的区域增长点云分割

在本教程中,我们将学习如何使用实现的基于颜色的区域增长算法。该算法基于与区域增长分割教程中描述的相同概念。基于颜色的算法有两个主要区别。第一个是它使用颜色而不是法线。第二个是它使用合并算法进行过分割和欠分割控制。让我们来看看它是如何完成的。分割后,尝试合并颜色相近的簇。将平均颜色差异较小的两个相邻簇合并在一起。然后进行第二个合并步骤。在此步骤中,每个集群都通过其包含的点数进行验证。如果此数字小于用户定义的值,则当前集群将与最近的相邻集群合并。源码:创建 region_growing_rgb_segmenta

2022-07-01 10:49:29 901

原创 pcl--基于区域增长的点云分割

在本教程中,我们将学习如何使用实现的区域增长算法。算法的目的是合并在平滑度足够接近的点。因此,该算法的输出是一组簇,其中每个簇是一组点,这些点被认为是同一光滑表面的一部分。该算法的工作是基于点法线之间角度的比较。理论:首先,它按曲率值对点进行排序。之所以需要这样做,是因为该区域从具有最小曲率值的点开始增长。这样做的原因是,具有最小曲率的点位于平坦的区域(从最平坦的区域开始增长可以减少区段的总数)。所以我们得到了排序后的云。直到点云中没有未标记的点为止,该算法提取曲率值最小的点并开始区域增长。此过程如下所示:

2022-06-28 21:56:19 726

原创 pcl --- 如何估计点云中的表面法线

表面法线是几何表面的重要属性,在许多领域(例如计算机图形应用程序)中被大量使用,以应用正确的光源来生成阴影和其他视觉效果。给定一个几何曲面,通常很容易将曲面上某个点的法线方向推断为垂直于该点曲面的向量。但是,由于我们获取的点云数据集代表了真实表面上的一组点样本,因此有两种可能性:本教程将解决后者,即给定一个点云数据集,直接计算云中每个点的表面法线。理论入门尽管存在许多不同的正态估计方法,但我们将在本教程中重点介绍的方法是最简单的一种,其公式如下。确定表面上一点的法线的问题近似为估计与表面相切的平面的法线的问

2022-06-28 21:33:20 673

原创 欧几里得聚类提取

本教程学习使用pcl::EuclideanClusterExtraction类进行欧几里得聚类提取。欧几里得聚类原理:聚类方法需要将一个无组织的点云模型p划分为更小的部分,从而大大减少了p的整体处理时间。一种简单的欧几里德意义上的数据聚类方法可以通过使用固定宽度的盒子或一般的八叉树数据结构来实现。然而,在更一般的意义上,我们可以利用最近邻并实现本质上类似于洪水填充算法的聚类技术。假设有一个点云,有一张桌子和上面的物体。我们希望找到并分割位于平面上的单个物体点簇。假设我们使用 Kd 树结构来寻找最近的邻居,那

2022-06-27 20:56:18 1842

原创 圆柱模型分割

本教程举例说明了如何为圆柱模型运行样本共识分割。为了使示例更实用,对输入数据集进行以下操作(按顺序):超过 1.5 米的数据点被过滤估计每个点的表面法线平面模型(描述我们演示数据集中的表)被分割并保存到磁盘一个圆柱形模型(描述我们演示数据集中的杯子)被分割并保存到磁盘下载数据集 https://raw.github.com/PointCloudLibrary/data/master/tutorials/table_scene_mug_stereo_textured.pcd创建cylinder_segment

2022-06-26 18:09:52 396

原创 进制转换---牛客

描述写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。数据范围:保证结果在 输入一个十六进制的数值字符串。输出该数值的十进制字符串。不同组的测试用例用\n隔开。stoi()将n进制数转换为10进制...

2022-06-26 16:09:04 135

原创 字符串分隔---华为机试

•输入一个字符串,请按长度为8拆分每个输入字符串并进行输出;•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。连续输入字符串(每个字符串长度小于等于100)依次输出所有分割后的长度为8的新字符串解法1: 解法2...

2022-06-26 15:21:33 100

原创 明明的随机数---华为机试

明明生成了N个1到500之间的随机整数。请你删去其中重复的数字,即相同的数字只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序输出。数据范围: 1

2022-06-26 11:36:42 226

原创 计算某字符出现次数---华为机试

写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母)第一行输入一个由字母和数字以及空格组成的字符串,第二行输入一个字符。输出输入字符串中含有该字符的个数。(不区分大小写字母)...

2022-06-26 10:46:06 58

原创 最后一个单词的长度---leetcode58题

给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。示例 1:输入:s = "Hello World"输出:5解释:最后一个单词是“World”,长度为5。思路:从最后一个字母,反向遍历字符串,遇到第一个空格,返回遍历次数,就是最后一个单词的长度。题解1:核心代码模式题解2:ACM模式...

2022-06-26 10:04:50 141

原创 如何从点云中提取点的子集

在本教程中,将学习 根据分割算法输出的索引 使用ExtractIndices过滤器从点云中提取点的子集。创建extract_indices.cpp文件源码:说明:1、加载一些所需头文件,创建点云对象,读取点云数据集,打印一些信息2、创建一个 VoxelGrid过滤器,对数据进行下采样。为了加快速度——更少的点意味着在分割循环中花费的时间更少。3、创建 SACSegment 对象并设置模型和方法类型。这也是我们指定“距离阈值”的地方,它决定一个点必须离模型多近才能被认为是一个内点。在本教程中

2022-06-23 20:45:10 212

原创 平面模型分割

在本教程中,将学习如何对一组点进行简单的平面分割,即找到点云中支持平面模型的所有点。创建planar_segmentation.cpp文件源码:说明:1、读取所需的头文件 2、创建点云对象,设置点云结构,随机生成点云数据,通过对z值设置为不同的值手动添加一些异常值,输出点云信息3、创建SACSegmentation对象并设置模型和方法类型。这也是我们指定“距离阈值”的地方,它决定了一个点必须离模型多近才能被视为内点。在本教程中,我们将使用 RANSAC 方法 (pcl::SAC_RANSA

2022-06-23 20:39:15 147

原创 将点投影到参数模型上

在本教程中,将学习如何将点投影到参数模型(例如,平面、球体等)上。参数模型通过一组系数给出——在平面的情况下,它的方程:ax + by + cz + d = 0。首先创建project_inliers.cpp文件源码:说明:1、导入相关头文件2、创建点云对象,设置点云结构,并且随机初始化点云,并且打印相关内容 3、填写 ModelCoefficients 值。使用平面模型,其中 ax+by+cz+d=0,其中 a=b=d=0,并且 c=1,即XY 平面。4、创建 ProjectIn

2022-06-23 19:11:04 130

原创 最后一块石头的重量Ⅱ---leetcode1049

有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x

2022-06-23 17:46:37 85

原创 PCL使用滤波器去除异常值

激光扫描通常会生成不同点密度的点云数据集。此外,测量误差会导致稀疏异常值,从而进一步破坏结果。这会使局部点云特征(例如表面法线或曲率变化)的估计复杂化,从而导致错误的值,进而可能导致点云配准失败。其中一些不规则性可以通过对每个点的邻域进行统计分析并修剪不符合特定标准的那些来解决。我们的稀疏异常值去除基于输入数据集中点到邻居距离分布的计算。对于每个点,我们计算从它到所有邻居的平均距离。通过假设结果分布是具有均值和标准偏差的高斯分布。首先,下载数据集table_scene_lms400.pcd 一、Statis

2022-06-21 19:58:17 801

原创 使用VoxelGrid体素化网格对点云进行下采样

首先,下载数据集table_scene_lms400.pcd 创建voxel_grid.cpp文件源码:说明:1、相关的头文件,创建点云对象 2、读取数据3、创建体素大小为一厘米的pcl::VoxelGrid过滤器4、 最后,将数据写入文件编译和运行1、将以下行添加到 CMakeLists.txt 文件中:2、运行3、 输出:......

2022-06-21 17:25:53 558

原创 分割等和子集---leetcode416题

给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200示例 1: 输入: [1, 5, 11, 5] 输出: true 解释: 数组可以分割成 [1, 5, 5] 和 [11].示例 2: 输入: [1, 2, 3, 5] 输出: false 解释: 数组不能分割成两个元素和相等的子集.提示:这题的本质是一道01背包问题明确以下问题:1、背包的体积为sum/22、背包要放入的物品相当于集合中的元素,每个

2022-06-21 11:24:31 137

原创 使用passthrough过滤器

沿指定维度执行简单的过滤——即截断在给定用户范围之内或之外的值。源码:首先创建一个passthrough.cpp文件代码分析:1、使用相关头文件,声明并且定义点云对象2、定义了点云的结构,随机填充点云,并且在屏幕上显示 3、创建passthrough对象,设置相关参数设置限定字段的名称字符串field_ name,例如"z",等:设置滤波限制条件包括最小值limit_ min和最大值limit_max。该函数与set-FilterFieldName()一起使用,点云中所有点的s

2022-06-20 21:32:43 262

原创 不同的二叉搜索树---leetcode96

给你一个整数 ,求恰由 个节点组成且节点值从 到 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。输入:n = 3输出:5思路:1、确定dp数组及其下标含义dp[i] 表示从1到i互不相同的二叉搜索数有dp[i]种2、确定递归公式递推公式:dp[i] += dp[j - 1] * dp[i - j]; ,j-1 为j为头结点左子树节点数量,i-j 为以j为头结点右子树节点数量3、dp初始化初始化dp[0] = 14、确定遍历顺序首先一定是遍历节点数,从递归公式:dp[i]

2022-06-20 09:32:24 229

原创 整数拆分---leetcode343题

给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。返回 你可以获得的最大乘积 。示例 1:输入: n = 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。示例 2:输入: n = 10输出: 36解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。 思路:1、确定dp数组及其下标含义dp[i] 表示拆分数字i可以得到的最大乘积为dp[i]2、确定递归公式从1遍历j,有两种渠道得到dp[i].一个是j * (i -

2022-06-20 09:05:27 54

原创 编写一个新的PCL类

为了说明代码转换过程,选择了以下示例:对来自给定输入点云的强度数据应用双边滤波器,并将结果保存到磁盘。代码:一个 I/O 组件: 第21-27行(从磁盘读取数据)和第64行(将数据写入磁盘)初始化组件:第29-35行(使用KdTree设置最近邻居的搜索方法)实际算法组件:第7-11行和第37-61行目标是将给定的算法转换为有用的PCL类,以便可以在其他地方重用。 一:设置结构:如果想让新算法成为PCL过滤库的一部分,首先在过滤器下创建3个不同的文件:设置一个新类的名称,让我们称之为BilateralF

2022-06-18 19:50:03 428

原创 c++---vector二维数组

1、创建二维数组:2、获取数组长度:3、赋值操作4、增加操作根据需求,增加操作可分为增加行和增加列。增加行列元素,可以使用vector提供的方法push_back()或insert()。对于增行,可以使用asd1.push_back(asd);,其中asd是vector。对于增加列中的元素,需要指定插入的行,可以使用asd1[0].push_back(23);完成插入操作。使用insert()时,需要使用迭代器才能完成在相应位置的插入操作。5、删除操作删除同样分为删除行和删...

2022-06-18 11:30:32 15527

原创 不同路径2---leetcode63题

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。思路:1、确定dp数组及下标含义:dp[i][j] 表示机器人到i,j点一共有dp[i][j]种方法2、确定递推公式 当i,j点没有障碍物时;dp[i][j] = dp[i - 1][j] + dp[i

2022-06-18 11:16:43 122

原创 不同路径---leetcode62题

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?1、确定dp数组及其下标含义dp[i][j]代表到底i,j有dp[i][j]种方法2、确定递推公式想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。所以:dp[i][j] = dp[i - 1][j] + dp[i][j - 1],3、

2022-06-18 10:51:37 79

原创 自定义PointT类型

一、pcl中的PointT类型完整列表请参见 point_types.hpp 1、PointXYZI - Members: float x, y, z, intensity;简单的 XYZ + 强度点型。在理想情况下,这4个组件将创建一个单一的结构,SSE 对齐。然而,由于大多数点操作要么将数据[4]数组的最后一个组件(从 xyz 联合)设置为0或1(用于转换) ,我们不能将强度设置为同一结构的成员,因为它的内容将被覆盖。例如,两点之间的点积将其第4个分量设置为0,否则点积就没有意义。因此,对于 SSE 对

2022-06-17 19:56:47 428

原创 惯性导航相关内容

一、惯性器件-加速度计当运载体相对惯性空间做加速度运动时,仪表壳体也随之做相对运动,质量块保持惯性,朝着与加速 度方向相反的方向产生位移(拉伸或压缩弹簧)。当位移量达到一定值时,弹簧给出的力使质量块以 同一加速度相对惯性空间做加速运动,加速度的大小与方向影响质量块相对位移的方向及拉伸量二、误差分析1、信号误差组成:2、Allan方差分析:imu数据仿真程序地址:https://github.com/Aceinna/gnss-ins-simAllan方差分析代码地址:https://github.com/ga

2022-06-17 19:10:42 1163 1

原创 使用最小花费爬楼梯---leetcode746题

数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。示例 1:输入:cost = [10, 15, 20] 输出:15 解释:最低花费是从 cost[1] 开始,然后走两步即可到阶梯顶,一共花费 15 。 示例 2:输入:cost = [1, 100,

2022-06-17 10:21:56 80

原创 爬楼梯---leetcode70题

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?示例 1:输入:n = 2输出:2解释:有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例 2:输入:n = 3输出:3解释:有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶这题和斐波那契数列是一样的解法1:动态规划解法2:维持2个变量...

2022-06-17 08:55:52 136

原创 509. 斐波那契数---leetcode

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:F(0) = 0,F(1) = 1F(n) = F(n - 1) + F(n - 2),其中 n > 1给定 n ,请计算 F(n) 。解法1:解法2:只维持dp[n-1],dp[n-2]这两个数值就行解法3:递归...

2022-06-16 10:58:07 82

原创 在pcl中使用矩阵进行点云变换

在自己项目中创建一个cpp文件复制以下代码: 说明:1.所需要的头文件2.如果用户没有提供预期的参数,此函数会显示帮助3. 我们在命令行上解析参数,使用-h 或-help 将显示帮助。这将终止程序4.在参数中查找 .ply 或 .pcd 文件名。如果没有找到;终止程序。bool file_is_pcd将帮助我们在加载 PCD 或 PLY 文件之间进行选择。5.加载 PCD/PLY 文件并检查文件是否加载成功。否则终止程序。6.创建转换矩阵,我们将一个 4x4 矩阵初始化为

2022-06-15 16:43:19 801

原创 将点云数据写入PCD文件

代码:pcd_write.cpp文件编译和运行程序:将以下行添加到 CMakeLists.txt 文件中:运行:

2022-06-14 20:05:07 442

原创 如何在自己项目中使用pcl

前提电脑已经下载编译安装了pcl首先新建一个文件夹project,其中包含一个cpp文件:pcd_write.cpp。在同一文件夹中创建一个CMakeLists.txt文件。其中包含:说明:强制性操作,cmake版本2.6此行命名项目名字并且设置一些有用的cmake变量, 例如引用源目录(MY_GRAND_PROJECT_SOURCE_DIR) 和从中调用 cmake 的目录 (MY_GRAND_PROJECT_BINARY_DIR) 的变量。要求找到最低版本为1.3的pcl包, 如果找不到,cmak

2022-06-14 19:15:36 562

原创 pcl基本数据结构

pcl1.x中的基本数据类型是PointCloud,是一个c++类,包含一下数据字段1.width(int)以点数为单位指定点云数据集的宽度,width有两种含义:2.height(int)以点数指定点云数据集的高度。高度有两个含义:无组织数据:3. point(std::vector)包含储存所有PointT类型的点的数据数组。例如:对于包含xyz数据的点云,包含pcl::PointXYZ元素的向量:4. is_dense(bool) 指定点中的所有数据是否都是有限的(真),或者某些点的 ...

2022-06-14 17:49:54 730

原创 NDT算法学习

直接上链接:1、理论学习:NDT算法论文 - 知乎点云 | 配准之NDT算法漫谈 - 墨天轮正态分布变换 NDT(Normal Distributions Transform)算法 - 知乎海森矩阵又叫黑塞矩阵,是一个多元函数的二阶偏导数构成的方阵,描述了函数的局部曲率。雅可比矩阵: 在向量微积分中,雅可比矩阵是一阶偏导数以一定方式排列成的矩阵,其行列式称为雅可比行列式。雅可比矩阵的重要性在于它体现了一个可微方程与给出点的最优线性逼近。因此,雅可比矩阵类似于多元函数的导数。.

2022-05-26 11:26:33 348

原创 从前序与中序遍历中构造二叉树---leetcode105题

给定两个整数数组preorder 和 inorder,其中preorder 是二叉树的先序遍历, inorder是同一棵树的中序遍历,请构造二叉树并返回其根节点。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(n...

2022-05-24 11:15:12 102

原创 从中序与后续遍历序列构造二叉树---leetcode106题

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗二叉树。解法1:递归法/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(...

2022-05-24 10:58:53 66

原创 路径总和2---leetcode113题

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。解法1:递归法/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left.

2022-05-24 10:13:24 57

原创 路径总和---leetcode112题

给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明:叶子节点是指没有子节点的节点。解法1:递归法/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullp...

2022-05-24 08:55:06 117

空空如也

空空如也

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

TA关注的人

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