CloudCompare中CCCoreLib模块介绍

论文阅读模块将分享点云处理,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点云地图中的定位方法

自动驾驶中基于光流的运动物体检测

基于语义分割的相机外参标定

综述:用于自动驾驶的全景鱼眼相机的理论模型和感知介绍

高速场景下自动驾驶车辆定位方法综述

Patchwork++:基于点云的快速、稳健的地面分割方法

PaGO-LOAM:基于地面优化的激光雷达里程计

多模态路沿检测与滤波方法

多个激光雷达同时校准、定位和建图的框架

动态的城市环境中杆状物的提取建图与长期定位

非重复型扫描激光雷达的运动畸变矫正

快速紧耦合的稀疏直接雷达-惯性-视觉里程计

基于相机和低分辨率激光雷达的三维车辆检测

用于三维点云语义分割的标注工具和城市数据集

ROS2入门之基本介绍

固态激光雷达和相机系统的自动标定

激光雷达+GPS+IMU+轮速计的传感器融合定位方案

基于稀疏语义视觉特征的道路场景的建图与定位

自动驾驶中基于激光雷达的车辆道路和人行道实时检测(代码开源)

用于三维点云语义分割的标注工具和城市数据集

更多文章可查看:点云学习历史文章大汇总

SLAM及AR相关分享

TOF相机原理介绍

TOF飞行时间深度相机介绍

结构化PLP-SLAM:单目、RGB-D和双目相机使用点线面的高效稀疏建图与定位方案

开源又优化的F-LOAM方案:基于优化的SC-F-LOAM

【开源方案共享】ORB-SLAM3开源啦!

【论文速读】AVP-SLAM:自动泊车系统中的语义SLAM

【点云论文速读】StructSLAM:结构化线特征SLAM

SLAM和AR综述

常用的3D深度相机

AR设备单目视觉惯导SLAM算法综述与评价

SLAM综述(4)激光与视觉融合SLAM

Kimera实时重建的语义SLAM系统

SLAM综述(3)-视觉与惯导,视觉与深度学习SLAM

易扩展的SLAM框架-OpenVSLAM

高翔:非结构化道路激光SLAM中的挑战

基于鱼眼相机的SLAM方法介绍

如果你对本文感兴趣,请后台发送“知识星球”获取二维码,务必按照“姓名+学校/公司+研究方向”备注加入免费知识星球,免费下载pdf文档,和更多热爱分享的小伙伴一起交流吧!

以上内容如有错误请留言评论,欢迎指正交流。如有侵权,请联系删除

扫描二维码

                   关注我们

让我们一起分享一起学习吧!期待有想法,乐于分享的小伙伴加入免费星球注入爱分享的新鲜活力。分享的主题包含但不限于三维视觉,点云,高精地图,自动驾驶,以及机器人等相关的领域。

分享及合作方式:微信“920177957”(需要按要求备注) 联系邮箱:dianyunpcl@163.com,欢迎企业来联系公众号展开合作。

点一下“在看”你会更好看耶

8cdb9d3aab5f76385a41b0df64e809d8.gif

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云PCL公众号博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值