论文阅读模块将分享点云处理,SLAM,三维视觉,高精地图相关的文章。公众号致力于理解三维视觉领域相关内容的干货分享,欢迎各位加入我,我们一起每天一篇文章阅读,开启分享之旅,有兴趣的可联系微信dianyunpcl@163.com。
摘要
CloudCompare是一个3D点云(和三角化网格)处理软件,它最初设计用于在两个3D点云之间(例如通过激光扫描仪获得的点云)或点云和三角化网格之间进行对比,它依赖于一个八叉树结构,该结构针对这个特定用例进行了高度优化,它还用于处理超大的点云(通常超过1000万个点,使用2GB内存最多可达1.2亿个点)。
基本介绍
其核心的算法库CCLib库,这个库提供用于处理三维点云数据的数据结构和算法。它是CloudCompare存储库的一部分(称为“CCLib”),也就是Cloudcompare源码中CC文件下的内容。
作者将其分离到单独的仓库中(https://github.com/CloudCompare/CCCoreLib),因为它本身很有用,而无需下载整个CloudCompare库,这使得使用CloudCompare项目的这一部分变得更容易,能够方便的使用。
接下我们以Cloudcompare中的CC文件夹为主进行一些分析和理解(有问题的地方请指教,欢迎交流),其CMake的依赖项有
(1)CGAL 计算几何算法库:是一个计算几何算法库,是一个大型 C + + 库的几何数据结构和算法,如 Delaunay 三角网,网格生成,布尔运算的多边形,以及各种几何处理算法。CGAL 是用来在各个领域:计算机图形学,科学可视化,计算机辅助设计与建模,地理信息系统,分子生物学,医学影像学,机器人学和运动规划,和数值方法。
(2)TBB:线程构建模块(Thread Building Blocks,简称TBB)是Intel公司开发的并行编程开发的工具。
头文件
接下里是根据文件的包含关系,从最底层开始介绍
CCTypes.h 定义了点云数据中每个点的数据类型,默认是using PointCoordinateType = float;以及单个字段的数据类型默认是float ,当然也可以定义为double,可配置。
CCConst.h定义了C++编程中常用的const变量,比如Pi,角度与弧度的计算,NaN的定义,以及点云是否可视化的定义如下:
- constexpr unsigned char POINT_VISIBLE = 0; /**< Point visibility state: visible **/
- constexpr unsigned char POINT_HIDDEN = 1; /**< Point visibility state: hidden (e.g. behind other points) **/
- constexpr unsigned char POINT_OUT_OF_RANGE = 2; /**< Point visibility state: out of range **/
- constexpr unsigned char POINT_OUT_OF_FOV = 4; /**< Point visibility state: out of field of view **/
CCShareable.h 这是一个由包含由CMake生成的头文件,决定是否激活共享对象的文件,也就是其他文件是否能够使用这个库的flag。
CCGeom.h 各种几何数据结构的定义,有2D vector, 3-Tuple结构,3D Vector,4-Tuple 结构等等。
GenericDistribution.h 处理概率分布的泛型类,主要就是判断点是否有限,判断点是否越界,计算点的欧式距离的泛型类。
题外话:泛型,实质上就是不使用具体数据类型(例如 int、double、float 等),而是使用一种通用类型来进行程序设计的方法,该方法可以大规模的减少程序代码的编写量,让程序员可以集中精力用于业务逻辑的实现。
NormalDistribution.h 正态/高斯统计分布,实现GenericDistribution接口。
GenericCloud.h 用于库和客户端应用程序之间数据通信的通用3D点云接口。
GenericOctree.h 用于库和客户端应用程序之间数据通信的通用八叉树接口。
CCPlatform.h 定义以下宏(取决于编译平台/CMake设置)。
- - CC_WINDOWS / CC_MAC_OS / CC_LINUX
- - CC_ENV32 / CC_ENV64
CCToolbox.h 仅用于分类空类型。
GenericMesh.h 用于库和客户端应用程序之间通信的通用网格数据接口。
ScalarField.h 与点云相关联的简单标量字段的函数,比如设置字段的name,获取字段的均值和方差,获取最大和最小值,获取某一个索引对应的字段等等。
GenericProgressCallback.h 通用进度指示的接口,用于向客户端应用程序通知算法进度。实现了一个不超过100步的管理进度的类。
FastMarching.h 实现快速三角化的算法。
RayAndBox.h 实现几何中的射线结构的类,实现了《An Efficient and Robust Ray-Box Intersection Algorithm》论文中的算法。
WeibullDistribution.h Weibull统计参数分布实现,基于GenericDistribution接口。
MeshSamplingTools.h实现mesh数据的采样,主要有计算mesh区域,计算mesh体积,计算mesh边连接的一些统计信息,采样mesh数据。
GenericTriangle.h 通用三角化接口。
GenericIndexedCloud.h 具有基于索引的点访问的通用三维点云数据。
CCMiscTools.h 其他可用功能(主要是几何元素处理)。
GenericIndexedMesh.h 由其3个顶点的索引描述的三角形。
SquareMatrix.h 方形矩阵。
MathTools.h 用于分类的空类。
DgmOctree.h 整个库中使用的八叉树结构,实现GenericOctree接口。
文章来源Corresponds to the octree structure developed during Daniel Girardeau-Montaut's PhD
AutoSegmentationTools.h 用于存储多个点子集的标准容器。AutoSegmentationTools工具箱的几种算法返回对应于每个分段零件的点子集的集合,此类集合通常存储在此类容器中。
Garbage.h 垃圾容器(销毁时自动删除指针)。
SimpleTriangle.h 三角化的类,使用对三维点的引用实现GenericTriangle类。
BoundingBox.h 包围盒的结构实现。
GenericIndexedCloudPersist.h 具有基于索引和对点的现有访问的通用三维点云,实现GenericIndexedCloud接口。
Grid3D.h 简单的3D网格结构 ,网格数据在内存中是连续的。
Jacobi.h 雅可比特征向量/值分解。
ConjugateGradient.h 执行共轭梯度优化的类,让“A*Xn=b”成为要优化的系统(在迭代n处)。首先,用户必须初始化A矩阵(N*N)和b向量(N*1)。然后使用X0初始化解算器。
StatisticalTestingTools.h 统计测试算法(Chi2距离计算、统计滤波等)。
CloudSamplingTools.h 几种点云重采样算法(基于八叉树、随机等)。
ScalarFieldTools.h 实现 K-mean类位置和边界。
ErrorFunction.h 实现 误差函数计算的相对误差。
FastMarchingForPropagation.h 表面波前传播的快速三角化算法。
SimpleMesh.h 简单的网格结构,具有基于索引的顶点访问,实现GenericIndexedMesh接口,该网格始终与存储网格顶点的(基于索引的)点云相关联。
Delaunay2dMesh.h 用于计算和处理点子集上的Delaunay 2D网格的类。
PointCloudTpl.h 存储效率高的点云结构,还可以处理无限数量的标量字段。
Neighbourhood.h 特定点可以通过结构来处理点的子集,并提供若干几何处理。
ReferenceCloud.h 实现简单的索引点云,实现GenericIndexedCloudPersist接口。一个简单的点云,将对Generic3dPoint实例的引用存储在向量中。
SaitoSquaredDistanceTransform.h 在三维网格上使用Saito算法计算平方距离场类的实现。
DgmOctreeReferenceCloud.h 一种基于DgmOctree::NeighborsSet结构的ReferenceCloud。
LocalModel.h 局部建模(通用接口),点云的局部曲面近似。
ManualSegmentationTools.h 手动分割算法的实现。
PointCloud.h 存储效率高的点云结构,还可以处理无限数量的标量字段。
Polyline.h 简单多段线类 ,多段线被视为具有打开/关闭状态信息的点云(按特定顺序)。
GeometricalAnalysisTools.h 计算点云几何特征的几种算法。
PointProjectionTools.h 几种点云重投影算法。
DistanceComputationTools.h 多种点云类到点云类距离计算算法(点云与点云、点云网格、点三角形等)。
RegistrationTools.h 基础的点云配准的算法。
KdTree.h 实现点到点距离相关功能的Kd树类。
TrueKdTree.h KD树实现。
ParallelSort.h 并行模式库(用于并行排序)。
资源
自动驾驶及定位相关分享
【点云论文速读】基于激光雷达的里程计及3D点云地图中的定位方法
自动驾驶中基于激光雷达的车辆道路和人行道实时检测(代码开源)
更多文章可查看:点云学习历史文章大汇总
SLAM及AR相关分享
结构化PLP-SLAM:单目、RGB-D和双目相机使用点线面的高效稀疏建图与定位方案
如果你对本文感兴趣,请后台发送“知识星球”获取二维码,务必按照“姓名+学校/公司+研究方向”备注加入免费知识星球,免费下载pdf文档,和更多热爱分享的小伙伴一起交流吧!
以上内容如有错误请留言评论,欢迎指正交流。如有侵权,请联系删除
扫描二维码
关注我们
让我们一起分享一起学习吧!期待有想法,乐于分享的小伙伴加入免费星球注入爱分享的新鲜活力。分享的主题包含但不限于三维视觉,点云,高精地图,自动驾驶,以及机器人等相关的领域。
分享及合作方式:微信“920177957”(需要按要求备注) 联系邮箱:dianyunpcl@163.com,欢迎企业来联系公众号展开合作。
点一下“在看”你会更好看耶