- 博客(132)
- 资源 (6)
- 收藏
- 关注
原创 PCL求助(一)-- 指针释放
在编写PCL相关程序时遇到了一个很奇怪的问题,希望能得到大佬的指点! 以一个简单的参数化模型投影点云为例://包含相应的头文件#include <iostream>#include <pcl/io/pcd_io.h>#include <pcl/point_types.h>#include <pcl/ModelCoefficients.h>#include <pcl/filters/project_inli...
2021-08-12 16:26:31
3577
45
原创 PCL学习笔记(三十五)-- 头文件依赖关系导致报错
今天在调试PCL程序时遇到了一个奇怪的问题:#include <pcl/visualization/cloud_viewer.h>#include <iostream>#include <pcl/io/io.h>#include <pcl/io/pcd_io.h>int user_data;void viewerOneOff(pcl::visualization::PCLVisualizer& viewer){...
2021-08-11 15:13:19
1734
5
原创 C#学习笔记(三十六)-- 多用途的事件处理程序
在处理事件中的Timer.Elapsed事件的委托包含了事件处理程序中常见的两类参数,如下所示: object.source——引发事件的对象的引用 ElapsedEventArgs e——由事件传送的参数 在这个事件(以及其他的事件中)使用object类型参数的原因是,我们常常要为由不同对象引发的几个相同事件使用同一个事件处理程序,但仍要指定是哪个对象生成了事件。 要说明这一点,下面将扩展使用事件中的示例。 ...
2021-08-10 11:17:42
298
2
原创 C#学习笔记(三十五)-- 定义事件
现在论述如何定义和使用自己的事件。我们将使用处理事件中介绍的即时消息传送应用程序示例,并创建一个Connection对象,该对象引发由Display对象处理的事件。1)在处理事件的源程序的同目录下,创建一个新的控制台应用程序Ch13Ex022)添加一个新类Connection,并修改Connection.cs,如下所示:using System;using System.Collections.Generic;using System.Lin...
2021-08-10 10:23:15
559
原创 C#学习笔记(三十四)-- 处理事件
要对事件进行处理,需要提供一个事件处理方法来订阅事件,该方法的返回类型和参数应该匹配事件指定的委托。下面的示例使用一个简单的计时器对象引发事件,调用一个处理方法。using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Timers;using static System.Console;na...
2021-08-10 08:42:15
398
1
转载 C#学习笔记(三十三)-- 事件
事件类似于异常,因为他们都是由对象引发(抛出),并且都可以通过我们提供的代码来进行处理。但他们也有几个重要区别。最重要的区别是并没有与try...catch类似的结构来处理事件,你必须订阅(subscribe)它们。订阅一个事件的含义是提供代码,在事件发生时执行这些代码,它们被称为事件处理程序。 单个事件可供多个处理程序订阅,在该事件发生时,这些处理程序都会被调用,其中包括引发该事件的对象所在的类中的事件处理程序,但事件的处理程序也可能在其他的类中。 事件处理程序本身都是简单方法...
2021-08-09 14:56:51
83
原创 C#学习笔记(三十二)-- ::运算符和全局名称空间限定符
::运算符提供了另一种访问名称空间中的类型的方式。如果要使用一个名称空间的别名。但该别名与实际名称空间层次结构之间的界限并不清晰,就必须使用::运算符。在那种情况下,名称空间层次结构优先于名称空间的别名。为阐明其含义,考虑下列代码:using MyNamespaceAlices = MyRootNamespace.MyNestedNamespace;namespace MyRootNamespace{ namespace MyNamespaceAlices { pu...
2021-08-09 14:36:37
254
原创 点云处理学习笔记(九)-- 模板匹配理论学习
一、模型描述和投票方案 首先,我们假设待匹配的场景(Scene)与用于匹配的模型(Model)都是由有限个有向点构成的,也就是说这里面的每个点都有一个对应的法向量(这样的表现特征可以很容易从网格(Mesh)或者点云(Clouds)中计算出来)。 将所有场景中的点表述为:...
2021-08-06 14:52:32
3260
11
原创 毕业设计(四)-- 指针式仪表读数
1 图像预处理 1.1 中值滤波 为了使输入图像更加清晰,需要对其进行去噪。在常用的去噪算法中,中值滤波可以很好的保留边缘信息同时去除噪点,中值滤波的原理是对矩阵中的像素值进行排序,并用序列中值替换该矩阵中心的数据。 中心点像素为0 处在图像上表现为一个噪点,经过中值滤波处理后,像素0 被替换为像素6。从数值变化的角度上,中值滤波是一种非线性变换,它只对矩阵中心点的像素进行了改变,对矩阵外围的像素数值没有进行改变;从图像的角度上,中值滤波可以对图像进行去噪,同时保留了更...
2021-07-30 16:23:01
4117
19
原创 毕业设计(三)-- 基于YOLOV3算法的指针式仪表表盘检测
YOLOV3 作为无需区域提名的目标检测算法中的代表算法,可以很好地适应基于视频流的指针式仪表检测任务,能够准确地从复杂生产环境中检测识别出指针式仪表并返回其位置信息,结合OpenCV 就可以从视频流中将指针式仪表的表盘截取出来,便于进行进一步的图像处理并读数。1 YOLO算法特点 YOLO 算法在整体的实现思路上采用卷积层实现特征的提取,池化层进行特征的筛选,接着在划分好的区域上生成候选框,由候选框实现目标识别与分类,最后用全局平均池化(Global AVG Pool)进行预测[2...
2021-07-30 15:32:35
5694
8
原创 PCL学习笔记(三十四)-- 无序点云的快速三角化
一、简介 使用贪婪三角化算法对有向点云进行三角化处理,具体方法是先将有向点云投影到某一局部二维坐标平面内,再在坐标平面内进行平面内的三角化,最后根据平面内三位点的拓扑连接关系获得一个三角化网格曲面模型。 贪婪投影三角化算法原理是处理一系列可以使网格“生长扩大”的点(边缘点),延伸这些点直到所有符合几何正确性和拓扑正确性的点都被连接上。该算法的优点是可以处理来自一个或多个扫描仪扫描得到并且有多个连接处的散乱点云。但该算法也有一定的局限性,更适用于采样点云来自于表面连续光滑的曲面并且点云密度...
2021-07-30 14:44:42
1914
原创 PCL学习笔记(三十三)-- 在平面模型上构建凸(凹)多边形
一、简介 在平面模型上构建凸(凹)多边形,首先从点云中提取平面模型,在通过该估计的平面模型系数从滤波后的点云投影一组点集形成点云,最后为投影后的点云计算其对应的二维凸(凹多边形)。二、代码分析 1)构建直通滤波器,对点云进行滤波处理,提高后续的分割的效果,然后打印相关信息输出到标准输出设备上: reader.read ("table_scene_mug_stereo_textured.pcd", *cloud);//读取点云数据 // Build a filter to ...
2021-07-30 11:19:25
1774
4
原创 PCL学习笔记(三十二)-- 基于多项式平滑点云及法线估计的曲面重建
一、简介 在测量较小的对象时会产生以西而误差,这些误差所造成的不规则数据如果直接拿来进行曲面重建的话会使重建的曲面不光滑或者而有漏洞。这些不规则很难用统计分析消除,所以为了建立完整的模型必须对表面进行平滑处理和漏洞修复。在不能进行额外扫描的情况下,可以通过对数据重采样来解决这一问题,重采样算法通过对周围数据点进行高阶多项式插值来重建表面缺少的部分。此外,由多个扫描点扫描结果配准后得到的数据直接拿来曲面重建的话会产生“双墙”等人造伪数据,即某块区域会出现重叠的两个曲面。重采样算法也可以对这个问题进行..
2021-07-30 09:34:19
1546
原创 PCL学习笔记(三十一)-- 基于超体素的点云分割
一、简介 超像素分割算法是将图像中的像素分割成符合目标物体边界的语义区域。基于图的算法,比如之所以MRF和CRF变得流行起来了,是因为该方法可以较好地融合高层语义只是和底层图像特征,消除高计算量的像素级图操作,而是转向中等级推理框架,该框架并不直接处理像素,而是使用像素群体,该像素群体被称作超像素。利用过分割的小区域,通过局部低层特征形成超像素。注意这里的像素和点云中的点对应,区别在于,点云一般是无序的,而像素都是有序的,不过都可以理解为对空间的一种离散采样表示。二、代码分析 1)输...
2021-07-29 16:50:05
6085
3
原创 PCL学习笔记(三十)-- 基于法线微分的分割
一、简介 根据不同尺度下法向量特征的差异性,利用类pcl::DifferenceOfNormalEstimation实现点云分割,该方法基于尺度的分割方法,可以根据给定尺度分割出对应尺度下的点云。基于Dof的多尺度分割方法计算效率高,可处理规模庞大的3D点云。该算法在概念上虽然非常简单,但在处理有较大尺度变化的场景点云分割时却异常有效。对输入点云P的每一个点p,利用不同的半径r1 > rs去估算同一点的两个单位法向量。利用输入点云的单位法向量的差定义DoN特征。通常DoN定义如下:...
2021-07-29 15:52:26
1948
2
原创 PCL学习笔记(二十九)-- 基于最小图割的分割算法
一、简介 基于最小图割的分割算法,通过设置目标物体的半径,三维坐标重心等参数,该算法将输入点云集合,划分为两个点集,前景点集(目标物体)和背景点云(剩余部分)。该算法思想如下: 1)构造图:首先定义源点和汇点两个顶点,对于输入点云,以每个点为图的顶点,途中的每个顶点与源点和汇点相连形成边,对应上述的t-links。另外,每个顶点(除了源点和汇点)与其临近点相连,对应上述n-links。 2)根据连接点的类型不同,边被分为以下三种情况,不同情况下,边被赋予不同的权值: ...
2021-07-29 14:28:13
1573
4
原创 PCL学习笔记(二十八)-- PCL编译问题汇总
1 VoxelGrid滤波器 在给出的示例程序中经常会出现以下报错:sensor_msgs::PointCloud2::Ptr cloud_blob (new sensor_msgs::PointCloud2), cloud_filtered_blob (new sensor_msgs::PointCloud2); 提示:没有sensor_msgs。原因是因为这段程序是用在ROS下的,在win下编译自然会出错,同样出错的还会有转换为模板点云代码: pcl::fromRO...
2021-07-29 13:19:32
1458
3
原创 PCL学习笔记(二十七)-- 基于颜色的区域生长分割
一、简介 该算法与区域生长算法一样,是基于同一策略之上的,其基本思想可参考区域生长算法相关章节。与区域生长算法相比,该算法主要有两个不同之处。第一,该算法用颜色测试代替了法线测试。第二,利用合并算法来控制过分割或欠分割。分割过程中,若两个相邻聚类的平均颜色相差较少,则将这两个聚类合并。然后进行第二步合并,在此步骤中,检查每一个聚类所包含的点的数量,如果这个数量小于用户定义的值,则当前这个聚类与其最近邻聚类合并在一起。二、代码分析 1)首先,从磁盘中读取点云数据,输入的点云数据必须带有...
2021-07-29 09:10:38
2103
1
原创 PCL学习笔记(二十六)-- 基于区域生长的分割
一、简介 区域生长分割算法的输出是一个聚类集合,每个聚类集合被认为是同一光滑表面的一部分。该算法思想:首先依据点的曲率值对点进行排序,之所以排序,是因为区域生长算法是从曲率最小的点开始生长的,这个点就是初始种子点,初始种子点所在的区域即为最平滑的区域,一般场景中平面区域较大,这样从最平滑的区域开始生长可减少分割区域的总数,提高效率。 算法的流程:设置一空的种子点序列和空的聚类数组,选好初始种子点后,将其加入到种子点序列中,并搜索邻域点。对每一个邻域点,比较邻域点的法线与当前种子点的法线之...
2021-07-28 16:31:56
2185
13
原创 毕业设计(二)-- 指针式仪表目标检测
1.1 目标检测的任务及分类 目标检测(Object Detection)就是要从图像中定位并框选出分类好的目标。这也就决定了目标检测的四大任务,下图所示: 1)分类(Classification):告诉计算机需要从视频或者图片中找出哪几类目标。 2)定位(Location):计算机识别出目标图像后,需要在原图片中用预测框框选出目标图像所在的位置。 3)检测(Object Detection):计算机不仅需要定位目标图像所在的位置,同时也需要知道定位的是哪一类目...
2021-07-28 14:37:39
3054
原创 PCL学习笔记(二十五)-- 圆柱体模型分割
一、简介 采用随机采样一致性估计从带有噪声的点云中提取一个圆柱体模型,程序的整体流程如下: (1)过滤掉远于1.5米的数据点; (2)估计每个点的表面法线; (3)分割出平面模型并进行保存; (4)分割出圆柱体模型并进行保存。二、代码分析 1)定义在代码中所使用的对象与数据对象,读取相应的点云数据: // All the objects needed //定义在程序中使用到的对象 pcl::PCDReader reader; ...
2021-07-28 14:12:29
2145
1
原创 PCL学习笔记(二十四)-- PCL实现平面模型分割
一、简介 PCL中Segementation库提供了点云分割的基础数据结构和部分通用的分割算法,目前实现的算法主要是基于聚类分割思想和基于随机采样一致性的分割算法,这些算法适用于将由多个空间分布独立的区域组成的点云分割成格子独立的点云子集,或者提取出特定的模型的点云数据,以便后续处理。二、代码分析 1)创建点云数据然后再屏幕上打印这些点的坐标值,为了达到本教程的目的,在数据中手动添加几个局外点,并设置它们的z值不为1,即不在z = 1所在的平面上的点作为局外点,在z = 1平面上的点...
2021-07-28 11:27:29
2285
原创 PCL学习笔记(二十三)-- 交互式迭代最近点配准
一、简介 在完成初始配准的情况下,一般采用ICP算法进行精细配准,标准的ICP配准算法是对源点云中的每个点,在目标点云中采用穷尽式凑所方法搜索距离最近的点作为对应点。然后求出配准对其所有对应点对的变换矩阵,最后将源点云数据通过该矩阵进行变换。算法一般设计一种或多种收敛规则,重复迭代地进行上述操作知道设计的收敛规则条件满足。如果不考虑测量误差,ICP算法的精度收到测量采样密度的影响,误差值正比于平均采样距离,即采样密度越高,拼合的精度也就越高。二、代码分析 1)为了进行测试,首先创建一...
2021-07-28 10:42:39
1272
原创 PCL学习笔记(二十二)-- 逐步匹配多幅点云
一、简介 逐步匹配多幅点云其思想时对所有点云进行变换,使得斗鱼第一个点云在同一坐标系中。在每个连贯的有重叠的点云之间找到最佳的变换,并累积这些变换到全部的点云。能够进行ICP算法的点云需要粗略的与匹配,并且一个点云与另一个点云需要有重叠部分。二、代码分析 1)首先,需要定义相关的头文件:#include <boost/make_shared.hpp> //boost指针相关头文件#include <pcl/point_types....
2021-07-28 09:21:34
1648
22
原创 PCL学习笔记(二十一)-- 迭代最近点算法
一、简介 ICP算法对待拼接的2片点云,首先根据一定的准则确立对应点集P与Q,其中对应点对的个数为n。然后通过最小二乘法迭代计算最优的坐标变化,即旋转矩阵R和平移矢量t,使得误差函数最小。ICP算法计算简便直观且可使拼接具有较好的精度,但是算法的运行速度以及向全局最优的收敛性却在很大程度上依赖于给定的初始变换估计以及在迭代过程中对应关系的确立。各种粗拼接技术可以为ICP算法提供较好的初始位置,所以迭代过程中确立正确对应点集以避免迭代陷入局部极值成为各种改进算法的关键,决定了算法的收敛速度与最终的拼..
2021-07-27 17:13:07
1065
原创 PCL学习笔记(二十)-- 随机采样一致性模型
一、简介 PCL中Sample_consense库实现了随机采样一致性及其繁华估计算法,以及例如平面、柱面等各种常见几何模型,用不同的估计算法和不同的几何模型自由结合估算点云中隐含的具体几何模型的系数,实现对点云中所处的几何模型的分割。线、平面、柱面和球面等模型已经在PCL库中实现,平面模型经常被应用到常见的室内平面分割提取中,比如墙、地板、桌面,其他模型常被应用到根据几何结构检测识别和分割物体中。二、代码分析 1)首先对两个点云进行定义初始化,并对其中一个点云填充点云数据,作为处理...
2021-07-27 15:56:33
1323
8
原创 C#学习笔记(三十一)-- 泛型接口、方法及委托
1 定义泛型接口 前面介绍了几个泛型接口,它们都位于Systems.Collections.Generic名称空间中,例如,上一个示例中使用的IEnumerable<T>。定义泛型接口与定义泛型类所用的技术相同,例如:interface MyFarmingInterface<T> where T : Animal{ bool AttemptToBreed(T animal1, T animal2); T OldestInHerd{ get; }...
2021-07-27 14:10:52
458
原创 C#学习笔记(三十)-- 定义泛型类型
要创建泛型类,只需要在类定义中包含尖括号语法:class MyGenericClass<T> {...} 其中T可以是任意标识符,只要遵循通常的C#命名规则即可,但一般只使用T。泛型类可在其定义中包含任意多个类型参数,参数之间用逗号分隔,例如:class MyGeneriaClass<T1, T2, T3> {...}class MyGenericClass<T1, T2, T3>{ private T1 innerT1Objec...
2021-07-27 11:35:56
1054
原创 C#学习笔记(二十九)-- List<T>与Dictionary<K, V>
System.Collections.Generic名称空间包含用于处理集合的泛型类型,常与using语句一起使用。1 List<T> List<T>泛型集合类型更快捷、更便于使用:不必再从CollectionBase中派生一个类,然后实现需要的方法。它的另一个好处是正常情况下需要实现的许多方法(例如,Add())已经自动实现了。 创建T类型对象的集合需要如下代码:List<T> myCollection = new List<...
2021-07-27 09:34:52
317
原创 毕业设计(一)-- 神经网络与深度学习
早期的人工神经网络(Artificial Neural Networks,下面简称为ANN),在输出层和输入层之间仅有一层隐含层,因此也被称为浅层网络。在隐含层中有多个神经元,对于一个单一的神经元而言,假设x 是其输入参数、w 是其权值参数、b 是其阈值、a 是预测的结果、h(x)是激活函数、y 是最终的预测结果并作为下一层某个神经元的输入[16]。 单个神经元的工作过程可以用四个函数描述: 1)前向传播函数:建立起训练集数据x 与预测结果a 之间的线性关系,通过输...
2021-07-27 07:59:04
2510
原创 C#学习笔记(二十八)-- 可空类型
一、可空类型 值类型必须包含一个值,它们可以在声明之后、赋值之前,在未赋值的状态下存在,但不能使用未赋值的变量。而引用类型可以是null。 有时让值类型为空时很有用的(尤其是在处理数据库时),泛型使用System.Nullable<T>类型提供了使值类型为空的一种方式。例如:System.Nullable<int> nullableInt; 这行代码声明了一个变量nullableInt,它可以拥有int变量能包含的任意值,还可以拥有值null,所以可以编写如下...
2021-07-26 17:18:56
406
原创 2021.7.26 杂记
从入职到现在,一直有一些困惑或者说隐忧在我的心头。最开始时自己很担心自己的能力并不匹配自己现在的岗位,因此也时常感到很有压力,虽然主管与家人都和我说刚入职有很多不明白是很正常的,但我依旧觉得,当自己感到担忧自己能力时,根本的原因还是自己不够努力。 于是,我每天都在努力学习C#和PCL的一些相关知识,也在同事的帮助下完成自己的任务,但是我又有了新的困惑:自己的学习方式真的正确吗?真的适合自己的学习目标吗?自己对于记录下来的笔记又真正了解多少呢?我想自己对于这些问题的答案肯定都是模糊的。 因此,...
2021-07-26 15:39:48
157
3
原创 C#学习笔记(二十七)-- 泛型的含义
基本集合可以包含在诸如ArrayList的类中,但这些集合是没有类型化的,所以需要把object项转换为集合中实际存储的对象类型,继承自System.Object的任何对象都可以存储在ArrayList中,所以要特别仔细。假定包含在集合中的某些类型可能导致抛出异常,而且代码逻辑崩溃。千米那介绍的技术可以处理这个问题,包括检查对象类型所需的代码。 但是更好的解决办法是一开始就使用强类型化的集合类。这种集合类派生于CollectionBase,并可以拥有自己的方法,来添加、删除和访问集合的成员,但它可...
2021-07-26 15:03:35
101
原创 PCL学习笔记(十九)-- CropHull任意多边形内部点云提取
一、简介 CropHull滤波器可以得到2D封闭多边形内部或者外部的点云。二、代码分析 1)首先,为了构造2D封闭多边形,需要输入2D平面点云,这些平面点是2D封闭多边形的顶点,接下来通过PCDReader类输入滤波对象点云: pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>); pcl::PCDReader reader; reader.read("p..
2021-07-26 13:57:35
2886
原创 PCL学习笔记(十八)-- ConditionalRemoval和RadiusOutliersRemoval滤波器移除离群点
一、简介 RadiusOutlierRemoval滤波处理会滤除那些一定范围内没有足够多近邻的点; ConditionalRemoval滤波器用于删除不符合用户要求的一个或多个数据点。二、代码分析 1)首先,程序会确保用户输入正确的命令行参数,并随机生成一个点云数据: if (argc != 2) { std::cerr << "please specify command line arg '-r' or '-c'" << std::end...
2021-07-26 13:20:44
1009
1
原创 PCL学习笔记(十七)-- ExtractIndices滤波器分割子集
一、简介 利用ExtractIndices滤波器,可以提取出点云中的子集。二、代码分析 1)首先,需要对所用到的点云格式进行转换: pcl::PCLPointCloud2::Ptr cloud_blob(new pcl::PCLPointCloud2), cloud_filtered_blob(new pcl::PCLPointCloud2); pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl..
2021-07-26 11:00:30
1976
5
原创 PCL学习笔记(十六)-- 使用参数化模型投影点云
一、简介 本小节将学习如何将点投影到一个参数化模型(例如平面或球等)。参数化模型通过一组参数来设定,对于平面来说,使用其等式形式 ax + by + cz + d = 0,在PCL中有特意存储常见模型系数的数据结构。二、代码分析 1)首先声明了ModelCoeffcients结构和ProjectInliers滤波器对应头文件。#include <pcl/ModelCoefficients.h>//模型系数定义头文件#include <pcl/filters/proj..
2021-07-26 09:42:22
2558
2
原创 PCL学习笔记(十五)-- StatisticalOutlierRemoval滤波器移除离群点
一、简介 激光扫描通常会产生密度不均匀的点云数据集。另外,测量中的误差会产生稀疏的离群点,使效果更糟。估计局部点云特征(例如采样点出的法向量或者曲率变化率)的运算很复杂,这会导致错误的数值,反过来有可能导致点云的配准等后期处理失败。 以下方法可以解决其中部分问题:对每个点的邻域进行一个统计分析,并修剪掉那些不符合一定标准的点。我们的稀疏离群点一处方法基于输入数据中对点到临近点的距离分布的计算。对每个点,我们计算它到它的所有临近点的平均距离。假设得到的结果是一个高斯分布,其形状由均值和标准差决定,..
2021-07-26 09:06:02
960
4
原创 PCL学习笔记(十四)-- VoxelGrid滤波器实现下采样
一、简介 使用体素化网格方式实现下采样,即减少点的数量,减少点云数据,并同时保持点云的形状特征,在提高配准、曲面重建、形状识别等算法速度中非常实用。PCL实现的VoxelGrid类通过输入的点云数据创建一个三维体素栅格(可把体素栅格想象为微小的空间三维立方体的集合),然后在每个体素(即三维立方体)内,用体素中所有点的重心来近似显示体素中的其他店,这样体素内所有点就用一个重心点最终表示。对于所有体素处理后得到过滤的点云,这种方法比用体素中心来逼近的方法更慢,但它对于采样点对应曲面的表示更为准确。二、.
2021-07-23 17:17:39
1493
原创 PCL学习笔记(十三)-- 直通滤波器
一、简介 直通滤波器可以对指定的维度进行一个简单的滤波,即去掉用户指定范围内部(或外部)的点。二、代码分析 在下列代码中,我们利用随机数生成了点云,作为滤波的输入点云数据,并将其打印到标准输出://填入点云数据 cloud->width = 5; cloud->height = 1; cloud->points.resize (cloud->width * cloud->height); for (size_t i = 0; i <..
2021-07-23 16:23:23
1428
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅