寫在前面
- 本文內容
點云算法的學習基礎,入門方法,相關領域,資源,開源庫,算法等的介紹;
以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等開源點云庫,技術交流、咨詢可私信