写在前面
- 本文内容
点云算法的学习基础,入门方法,相关领域,资源,开源库,算法等的介绍;
以Open3D和PCL等为基础工具的点云处理代码讲解、实现;
文中涉及的参考以链接形式给出,涉及文件资源如点云,已上传至网盘本博客资源链接,路径为:
share_noel/csdn/how_to_learn_point_cloud/how_to_learn_point_cloud_1;
本文尽力用最简单易懂的语言和方式来介绍相关内容,欢迎补充指正! - 平台/环境
Windows10, Ubuntu1804, CMake, Open3D, PCL - 转载请注明出处:
https://blog.csdn.net/qq_41102371/article/details/136288203
目录
- 写在前面
- 点云基础
- 什么是点云
- 点云获取方式、作用、相关领域
- 点云算法有哪些有何用?
- 资源
- 常用开源库
- 参考
- 完
点云基础
什么是点云
最好的认知方式莫过于实践,现在你可以下载一个开源且跨平台的点云可视化、处理软件CloudCompare(如果你以后的学习或工作经常和点云打交道,请一定记住这个软件,它将成为你的得力助手!),以及上述网盘中的点云或者你自己的点云,用CloudCompare打开下载的点云看看,建立一个感性认知,一切的故事,将从这里开始。
下面是比较理性的认知:
点云(PointCloud),是一种三维空间目标的表现形式,可用一群空间离散三维点 ( x , y , z ) (x, y, z) (x,y,z) 的集合来表达,如 { P } \{P\} {P} 表示一个有 N N N 个点的点云, p i , i ∈ { 0 , 1 , 2... n } p_i, i\in\{0,1,2...n\} pi,i∈{0,1,2...n} 是其中任意一点;另外,一个三维点除了空间位置信息 ( x , y , z ) (x, y, z) (x,y,z) ,还可包含颜色信息、强度信息、法向量等,以Open3D和PCL中点云的数据结构为例:
- Open3D
Open3D以点云为一个数据结构,点(points),颜色(colors),法向量(normals)都以3维的Vector表示(Eigen::vector3d)
points: { ( x i , y i , z i ) , i ∈ 0 , 1 , 2... n } \{(x_i, y_i, z_i), i\in{0,1,2...n}\} {(xi,yi,zi),i∈0,1,2...n}
colors: { ( r i , g i , b i ) , i ∈ 0 , 1 , 2... n } \{(r_i, g_i, b_i), i\in{0,1,2...n}\} {(ri,gi,bi),i∈0,1,2...n}
normals { ( n x i , n y i , n z i ) , i ∈ 0 , 1 , 2... n } \{(nx_i, ny_i, nz_i), i\in{0,1,2...n}\} {(nxi,nyi,nzi),i∈0,1,2...n}
具体可见
open3d::geometry::PointCloud Class Reference
https://github.com/isl-org/Open3D/blob/main/cpp/open3d/geometry/PointCloud.h#L463
- PCL
PCL以点为基础的数据结构,通过模板的方式以点的类型决定点云的类型,如PointXYZ, PointXYZI, PointXYZRGB分别表示三维点、带强度的三维点、带RGB的三维点,详见
https://pointclouds.org/documentation/namespacepcl.html
pcl::PointXYZRGB Struct Reference
pcl::PointCloud< PointT > Class Template Reference
点云获取方式、作用、相关领域
-
通过传感器获取
当前可以获取点云的常用传感器为:-
激光雷达
1、大型激光雷达扫描仪(如Leica, RIEGL等),常用于需要大范围、高精度但不要求实时性的场景,比如测绘、矿山测量、灾害现场重建。如莱卡HDS8800可达上千米的扫描范围,但价格在百万以上;
以下是Leica HDS8800扫描得到室外建筑:
2、小型固态、半固态、机械式激光雷达(Livox, 禾赛, Velodyne等),常用于实时性要求较高的工业机器人、自动驾驶等领域,价格一般在千元-万元级;
以下是Livox Avia非重复式扫描得到的点云:
-
深度相机
如Intel Realsense, 奥比中光, 银牛等,常用于机器人、消费级产品,如体感游戏、服务机器人、扫地机、小场景三维扫描仪等;
https://www.intelrealsense.com/lidar-camera-l515/ -
结构光相机
如ZIVID、Photoneo、图漾、跨维智能、Mech-Mind等,常用于精度要求极高的场景,如工业表面缺陷检测;
示例点云见https://sketchfab.com/zivid/collections/manufacturing-point-clouds-18a888a297e34098ba4a7c478a049a70
另可参考
徕卡HDS8800
leica HDS硬件产品系列
RIEGL VZ-400i
https://www.open3d.org/docs/release/tutorial/sensor/azure_kinect.html
浅谈单目结构光原理
深度相机—TOF、RGB双目、结构光原理及优势对比
3D深度相机调研【史上最全,不服来战】 -
-
通过影像三维重建获取
运动恢复结构(Structure From Motion, SFM)可以从二维影像中恢复相机位姿和稀疏三维空间点云,再通过稠密重建得到带RGB的稠密点云,后续经过表面重建、纹理贴图可以生成带纹理的Mesh模型,其中比较基础和出名的开源方案(pipeline)是OpenMVG(SFM)+OpenMVS(稠密、表面、纹理),以及Colmap(完整pipeline);
影像三维重建同时也是一个比较大的研究方向,通过该方式获得的点云具有稠密、带纹理等特点,但无法恢复尺度信息,需要人工或者借助GPS等信息加入算法来恢复;普通的开源方案(OpenMVG+OpenMVS, Colmap, OpenSfm, AliceVison)适用于小目标、室内、室外建筑场景三维重建,比较专业的采集+处理软件可用于城市级三维重建(摄影测量)
有兴趣可以参考:
Awesome 3D reconstruction list
SFM综述
openmvg2.0编译与使用
openmvs编译与使用
用cmake在win10配置colmap
下图是SFM稀疏重建得到的点云,可参考openmvg2.0编译与使用来生成
-
通过模型采样、人工合成获取
点云通过表面重建的方式可以生成表面模型如Mesh,反之可以从表面模型上采样得到点云
-
开源数据集
Stanford Bunny,点云界的Lenna.jpg
武大WHU-TLS
Modelnet-40
3DMatch数据集
Kitti
…
点云算法有哪些有何用?
点云算法按整个来说应当属于计算机视觉中的3D视觉领域,主要的算法和应用为:
- 传统的点云算法
采样、滤波去噪、法向估计、特征提取、拟合、配准、(语义)分割、场景重建、表面(Mesh)重建等; - 深度学习点云算法
近些年也有了许多点云深度学习的方法,如深度学习点云法向估计、点云语义分割、点云目标检测、点云配准、点云表面重建、点云逆向工程等,点云深度学习也是比较热门的研究方向; - 应用
其中,采样、滤波去噪、法向估计、特征提取算法是最基础的算法,一般用于点云的预处理;拟合、分割、配准等算法属于更高级的应用,直接或间接地为用户提供点云处理结果,在这些算法基础上,进一步处理获得目标或场景的完整模型、语义信息、表面模型等;
这些点云算法通常作为基础算法服务于三维重建、SLAM、自动驾驶领域,比如点云三维重建用于测绘、地质调查、文物重建、数字资产、数字城市等,SLAM中地图点云用于机器人定位、导航、避障等,自动驾驶中点云用于3D目标检测、高精地图制作的基础数据等,尤其是像点云配准、分割、3D目标检测等算法,在这些领域起到了至关重要的作用,因此点云算法可以认为是3D视觉的重要基础之一。
资源
一些点云相关的资源
点云配准系列文章
Open3D点云处理
https://github.com/topics/point-cloud
https://github.com/timzhang642/3D-Machine-Learning
https://github.com/topics/point-cloud
https://github.com/zhulf0804/3D-PointCloud
常用开源库
常用的点云算法开源库有:
Open3D, PCL, CGAL, CloudCompare等
参考
文中已列出
完
主要做激光/影像三维重建,配准、分割等常用点云算法,熟悉open3d、pcl等开源点云库,技术交流、咨询可私信