常見(jiàn)點(diǎn)云文件解析學(xué)習(xí)筆記

本博客內(nèi)容來(lái)源于網(wǎng)絡(luò)以及其他書(shū)籍,結(jié)合自己學(xué)習(xí)的心得進(jìn)行重編輯,因?yàn)榭戳撕芏辔恼虏槐阋灰粯?biāo)注引用,如圖片文字等侵權(quán),請(qǐng)告知?jiǎng)h除。

傳統(tǒng)2D計(jì)算機(jī)視覺(jué)學(xué)習(xí)筆記目錄------->傳送門(mén)
傳統(tǒng)3D計(jì)算機(jī)視覺(jué)學(xué)習(xí)筆記目錄------->傳送門(mén)

為什么會(huì)有這么多的點(diǎn)云文件

我們?cè)谧?D視覺(jué)時(shí),處理的就是類(lèi)似一系列類(lèi)似的二維數(shù)組,數(shù)組以圖片的形式進(jìn)行保存,處理的圖片也有甚多的格式,比如png,jpg,bmp等。那我們?cè)谧?D視覺(jué)的時(shí)候,處理的主要是點(diǎn)云,點(diǎn)云就是由一些點(diǎn)的集合。點(diǎn)云在組成特點(diǎn)上分為兩種,一種是有序點(diǎn)云,一種是無(wú)序點(diǎn)云。

  • 有序點(diǎn)云:一般由深度圖還原的點(diǎn)云,有序點(diǎn)云按照?qǐng)D方陣一行一行的,從左上角到右下角排列,當(dāng)然其中有一些無(wú)效點(diǎn)因?yàn)椤S行螯c(diǎn)云按順序排列,可以很容易的找到它的相鄰點(diǎn)信息。有序點(diǎn)云在某些處理的時(shí)候還是很便利的,但是很多情況下是無(wú)法獲取有序點(diǎn)云的。
  • 無(wú)序點(diǎn)云:無(wú)序點(diǎn)云就是其中的點(diǎn)的集合,點(diǎn)排列之間沒(méi)有任何順序,點(diǎn)的順序交換后沒(méi)有任何影響。是比較普遍的點(diǎn)云形式,有序點(diǎn)云也可看做無(wú)序點(diǎn)云來(lái)處理。
點(diǎn)云

在對(duì)點(diǎn)云這個(gè)格式有了初步的了解之后,我們來(lái)看看該怎么保存這些點(diǎn)云呢。

目前就文件格式而言有ASCII碼和二進(jìn)制兩種編碼形式,ASCII碼可以直接閱讀里面存儲(chǔ)的內(nèi)容,二進(jìn)制的保存形式則不可讀,但體積會(huì)更小。這兩種保存都是沒(méi)有進(jìn)行過(guò)壓縮的。

文件的內(nèi)容的組成就有很多種形式了,也是本篇文章主要介紹的內(nèi)容,我們來(lái)看看常見(jiàn)的格式:

  • *.pcd
  • *.off
  • *.xyz
  • *.ply
  • *.las
  • *.laz
  • *.obj
  • *.stl
  • *.vtk
  • *.3ds
    等……

怎么這么多啊 w(?Д?)w

點(diǎn)云文件格式詳細(xì)解析

下面我對(duì)上面描述的一些常見(jiàn)的格式,進(jìn)行詳細(xì)的描述。

  • *.pcd

# .PCD v.7 - Point Cloud Data file format    
VERSION .7               //指定PCD文件版本
FIELDS x y z rgb        //指定一個(gè)點(diǎn)可以有的每一個(gè)維度和字段的名字
SIZE 4 4 4 4              //用字節(jié)數(shù)指定每一個(gè)維度的大小
TYPE F F F F              //用一個(gè)字符指定每一個(gè)維度的類(lèi)型
COUNT 1 1 1 1           //指定每一個(gè)維度包含的元素?cái)?shù)目
WIDTH 213                //用點(diǎn)的數(shù)量表示點(diǎn)云數(shù)據(jù)集的寬度
HEIGHT 1                  //用點(diǎn)的數(shù)量表示點(diǎn)云數(shù)據(jù)集的高度,無(wú)序點(diǎn)云會(huì)是1
VIEWPOINT 0 0 0 1 0 0 0    //指定數(shù)據(jù)集中點(diǎn)云的獲取視點(diǎn)。
POINTS 213              //點(diǎn)云中點(diǎn)的數(shù)目
DATA ascii                 //數(shù)據(jù)保存的編碼方式
0.93773 0.33763 0 4.2108e+06        //每個(gè)點(diǎn)的數(shù)據(jù),根據(jù)FIELDS,可知按順序分別是x,y,z rgb
0.90805 0.35641 0 4.2108e+06

pcd作為PCL庫(kù)官方指定格式,典型的為點(diǎn)云量身定制的格式。優(yōu)點(diǎn)是支持n維點(diǎn)類(lèi)型擴(kuò)展機(jī)制,能夠更好的發(fā)揮PCL庫(kù)的點(diǎn)云處理性能。文件格式有文本和二進(jìn)制兩種格式。僅能支持點(diǎn)云數(shù)據(jù),不能支持線面數(shù)據(jù)。

  • *.off

OFF格式文件頭有兩行:第一行以off關(guān)鍵字開(kāi)頭,第二行表示頂點(diǎn)數(shù)、面數(shù)、邊數(shù)。主體分為頂點(diǎn)坐標(biāo)(頂點(diǎn)列表)和面的頂點(diǎn)索引(面列表)兩個(gè)部分,其中每個(gè)面的頂點(diǎn)數(shù)可以指定,用第一個(gè)數(shù)表示。

OFF
頂點(diǎn)數(shù) 面數(shù) 邊數(shù)
x y z
x y z
…

n個(gè)頂點(diǎn) 頂點(diǎn)1的索引 頂點(diǎn)2的索引 … 頂點(diǎn)n的索引
…
OFF 
8 6 0 
-0.500000 -0.500000 0.500000 
0.500000 -0.500000 0.500000 
-0.500000 0.500000 0.500000 
0.500000 0.500000 0.500000 
-0.500000 0.500000 -0.500000 
0.500000 0.500000 -0.500000 
-0.500000 -0.500000 -0.500000 
0.500000 -0.500000 -0.500000 
4 0 1 3 2 
4 2 3 5 4 
4 4 5 7 6 
4 6 7 1 0 
4 1 7 5 3 
4 6 0 2 4

OFF相對(duì)其他格式,更加的簡(jiǎn)單,可以存儲(chǔ)點(diǎn)和面,僅有文本格式。

  • *.xyz

xyz以行數(shù)來(lái)表明點(diǎn)數(shù),沒(méi)有頭進(jìn)行解釋(此外還有一種xyz 格式,是一種原子構(gòu)型文件)

17.371559 -6.531680 -8.080792 0.242422 0.419118 0.874970  //一般前三個(gè)數(shù)帶標(biāo)xyz,后面三個(gè)數(shù)代表法向量,也有代表顏色信息的。
15.640106 -16.101347 -9.550241 -0.543610 -0.382877 0.746922  
17.750742 -6.395478 -8.307115 0.333093 0.494766 0.802655  
15.432834 -15.947010 -9.587061 -0.548083 -0.385148 0.742473  
23.626318 -7.729815 -13.608750 0.081697 0.502976 0.860431  
15.300377 -15.610346 -9.547507 -0.569658 -0.341132 0.747743  
23.975805 -7.512131 -13.775388 0.082388 0.564137 0.821561  
24.251831 -7.345085 -13.949208 0.099309 0.574142 0.812711  

這個(gè)文件的優(yōu)點(diǎn)是很簡(jiǎn)單,直接重新造輪子也沒(méi)有問(wèn)題,缺點(diǎn)是表意不明。

  • *.ply

文件主要組成部分
Header  (頭部)
Vertex List  (頂點(diǎn)列表)
Face List  (面列表)
(lists of other elements) (其它元素列表)
ply                                          //關(guān)鍵字
format ascii 1.0                    //文件編碼格式
comment author: Greg Turk                            // 注釋
comment object: another cube                      //注釋
element vertex 8                                        // 定義元素為頂點(diǎn) 數(shù)目為8個(gè)
property float x                                          // 上述頂點(diǎn)元素中的屬性 x,數(shù)據(jù)類(lèi)型為float
property float y                                          // 上述頂點(diǎn)元素中的屬性 y,數(shù)據(jù)類(lèi)型為float
property float z                                          // 上述頂點(diǎn)元素中的屬性 z,數(shù)據(jù)類(lèi)型為float
property uchar red                                   // 上述頂點(diǎn)元素中的屬性 red,數(shù)據(jù)類(lèi)型為uchar
property uchar green                               // 上述頂點(diǎn)元素中的屬性 green,數(shù)據(jù)類(lèi)型為uchar
property uchar blue                                // 上述頂點(diǎn)元素中的屬性 blue,數(shù)據(jù)類(lèi)型為uchar
element face 7                                        // 定義面元素,數(shù)目為7個(gè)
property list uchar int vertex_index      // 定義面元素內(nèi)的列表屬性,列表開(kāi)頭以u(píng)char的數(shù)值表示列表的項(xiàng)目數(shù),后面接著型態(tài)為int的頂點(diǎn)索引值(vertex_indices),頂點(diǎn)索引值從0開(kāi)始。
element edge 5                                      //定義元素為邊,數(shù)目為5個(gè)
property int vertex1                  
property int vertex2                  
property uchar red                    
property uchar green
property uchar blue
end_header                                                  // 文件頭部分結(jié)束
0 0 0 255 0 0                         //頂點(diǎn)的開(kāi)始,分別為x y z r g b
0 0 1 255 0 0
0 1 1 255 0 0
0 1 0 255 0 0
1 0 0 0 0 255
1 0 1 0 0 255
1 1 1 0 0 255
1 1 0 0 0 255
3 0 1 2                           //面的開(kāi)始,這是個(gè)三角行,分別有第0 ,1, 2 相連
3 0 2 3                           
4 7 6 5 4                        // 這是個(gè)四邊形,頂點(diǎn)分別是第 7 6 5 4個(gè)點(diǎn) 
4 0 4 5 1
4 1 5 6 2
4 2 6 7 3
4 3 7 4 0
0 1 255 255 255                   // 邊的開(kāi)始,頂點(diǎn)分別是第0個(gè)與第一個(gè)點(diǎn),顏色是255,255,255
1 2 255 255 255
2 3 255 255 255
3 0 255 255 255

PLY多邊形文件格式,用于存儲(chǔ)被描述為多邊形集合的圖形對(duì)象的格式,有用于輕松啟動(dòng)的ASCII表示形式,以及用于緊湊存儲(chǔ)和快速保存和加載的二進(jìn)制版本。它可以儲(chǔ)存的資訊包含顏色、透明度、表面法向量、材質(zhì)座標(biāo)與資料可信度,并能對(duì)多邊形的正反兩面設(shè)定不同的屬性,是一個(gè)比較通用和普遍的格式。

  • *.las

LiDAR數(shù)據(jù)的工業(yè)標(biāo)準(zhǔn)格式,旨在提供一種開(kāi)放的格式標(biāo)準(zhǔn),允許不同的硬件和軟件提供商輸出可互操作的統(tǒng)一格式。是一種二進(jìn)制文件格式。las文件格式除了基本的三維坐標(biāo)之外,保留了原始掃描的數(shù)據(jù)采集信息。

一個(gè)符合LAS標(biāo)準(zhǔn)的LIDAR文件分為三個(gè)部分:公用文件頭塊、變量長(zhǎng)度記錄和點(diǎn)數(shù)據(jù)記錄。

LAS文件包含以下信息:
C--class(所屬類(lèi))
XYZ -三維坐標(biāo)
F一flight(航線號(hào))
T一time(GPS時(shí)間)
I一intensity(回波強(qiáng)度)
R一return(第幾次回波)
N一number of return(回波次數(shù))
A一scan angle(掃描角)
RGB一red green blue(RGB顏色值)

  • *.obj

obj是一種文本文件,通常用以“#”開(kāi)頭的注釋行作為文件頭,數(shù)據(jù)部分每一行的開(kāi)頭關(guān)鍵字代表該行數(shù)據(jù)所表示的幾何和模型元素,以空格做數(shù)據(jù)分隔符。

# The units used in this file are centimeters. 
  g default                           // 組名稱
  v -0.500000 -0.500000 0.500000     // v 代表頂點(diǎn)坐標(biāo)
  v 0.500000 -0.500000 0.500000 
  v -0.500000 0.500000 0.500000 
  v 0.500000 0.500000 0.500000 
  v -0.500000 0.500000 -0.500000 
  v 0.500000 0.500000 -0.500000 
  v -0.500000 -0.500000 -0.500000 
  v 0.500000 -0.500000 -0.500000 
  vt 0.000000 0.000000                   //"vt"代表點(diǎn)的貼圖坐標(biāo)
  vt 1.000000 0.000000 
  vt 0.000000 1.000000 
  vt 1.000000 1.000000 
  vt 0.000000 2.000000 
  vt 1.000000 2.000000 
  vt 0.000000 3.000000 
  vt 1.000000 3.000000 
  vt 0.000000 4.000000 
  vt 1.000000 4.000000 
  vt 2.000000 0.000000 
  vt 2.000000 1.000000 
  vt -1.000000 0.000000 
  vt -1.000000 1.000000 
  vn 0.000000 0.000000 1.000000       //vn 代表頂點(diǎn)法線
  vn 0.000000 0.000000 1.000000 
  vn 0.000000 0.000000 1.000000 
  vn 0.000000 0.000000 1.000000 
  vn 0.000000 1.000000 0.000000 
  vn 0.000000 1.000000 0.000000 
  vn 0.000000 1.000000 0.000000 
  vn 0.000000 1.000000 0.000000 
  vn 0.000000 0.000000 -1.000000 
  vn 0.000000 0.000000 -1.000000 
  vn 0.000000 0.000000 -1.000000 
  vn 0.000000 0.000000 -1.000000 
  vn 0.000000 -1.000000 0.000000 
  vn 0.000000 -1.000000 0.000000 
  vn 0.000000 -1.000000 0.000000 
  vn 0.000000 -1.000000 0.000000 
  vn 1.000000 0.000000 0.000000 
  vn 1.000000 0.000000 0.000000 
  vn 1.000000 0.000000 0.000000 
  vn 1.000000 0.000000 0.000000 
  vn -1.000000 0.000000 0.000000 
  vn -1.000000 0.000000 0.000000 
  vn -1.000000 0.000000 0.000000 
  vn -1.000000 0.000000 0.000000 
  s off                                                   //表示關(guān)閉光滑組
  g pCube1                                         //
  usemtl initialShadingGroup             //表示使用的材質(zhì)
  f 1/1/1 2/2/2 4/4/3 3/3/4                 //f 面,頂點(diǎn)索引/uv點(diǎn)索引/法線索引
  f 3/3/5 4/4/6 6/6/7 5/5/8 
  f 5/5/9 6/6/10 8/8/11 7/7/12 
  f 7/7/13 8/8/14 2/10/15 1/9/16 
  f 2/2/17 8/11/18 6/12/19 4/4/20 
  f 7/13/21 1/1/22 3/3/23 5/14/24 

obj文件的特點(diǎn):

  • OBJ是一種3D模型文件,因此不包含動(dòng)畫(huà)、材質(zhì)特性、貼圖路徑、動(dòng)力學(xué)、粒子等信息。
  • OBJ文件主要支持多邊形(Polygons)模型,也支持曲線(Curves)、表面(Surfaces)、點(diǎn)組材質(zhì)(Point Group Materials)。
  • OBJ文件支持三個(gè)點(diǎn)以上的面。
  • OBJ文件支持法線和貼圖坐標(biāo)。

obj還有很多更復(fù)雜的內(nèi)容,再次就不進(jìn)行更多的解釋了。

相應(yīng)基礎(chǔ)算法庫(kù)對(duì)不同格式的支持

上面的這些點(diǎn)云文件的格式用代碼實(shí)現(xiàn)解析也是非常容易的。但是作為一個(gè)開(kāi)發(fā)者,最大的忌諱就是不要重復(fù)造輪子(練習(xí)另當(dāng)別論)。所以,下面羅列了一下,當(dāng)前我用的比較多的開(kāi)源算法基礎(chǔ)庫(kù)對(duì)點(diǎn)云讀取的支持。

  • PCL

PCL(Point Cloud Library)是在吸收了前人點(diǎn)云相關(guān)研究基礎(chǔ)上建立起來(lái)的大型跨平臺(tái)開(kāi)源C++編程庫(kù),它實(shí)現(xiàn)了大量點(diǎn)云相關(guān)的通用算法和高效數(shù)據(jù)結(jié)構(gòu),涉及到點(diǎn)云獲取、濾波、分割、配準(zhǔn)、檢索、特征提取、識(shí)別、追蹤、曲面重建、可視化等。支持多種操作系統(tǒng)平臺(tái)。缺點(diǎn)就是:目前庫(kù)的維護(hù)好像停滯了……

支持文件讀取:PLY、PCD、OBJ、VTK、IFS

  • vcglib

VCG Libary(Visulization and Computer Graphics Libary)是專門(mén)為處理三角網(wǎng)格而設(shè)計(jì)的,庫(kù)很大,且提供了許多先進(jìn)的處理網(wǎng)格的功能,以及比較少的點(diǎn)云處理功能。用的比較的輕型點(diǎn)云處理軟件meshlab就是以vcglib為底層實(shí)現(xiàn)的。這個(gè)庫(kù)的缺點(diǎn)就是文檔太少了(基本等于沒(méi)有),對(duì)初學(xué)者不友好。

支持文件讀取: PLY, STL, OFF, OBJ, 3DS, COLLADA, PTX, V3D, PTS, APTS, XYZ, GTS, TRI, ASC, X3D, X3DV, VRML, ALN
支持文件保存: PLY, STL, OFF, OBJ, 3DS, COLLADA, VRML, DXF, GTS, U3D, IDTF, X3D

  • cgal

CGAL(Computational Geometry Algorithms Library)計(jì)算幾何算法庫(kù),設(shè)計(jì)目標(biāo)是,以C++庫(kù)的形式,提供方便,高效,可靠的幾何算法。其實(shí)現(xiàn)了很多處理點(diǎn)云以及處理網(wǎng)格的算法。個(gè)人感覺(jué)里面實(shí)現(xiàn)了很多比較新的算法,對(duì)于學(xué)習(xí)算法和測(cè)試demo還是比較好的,文檔也比較全面。缺點(diǎn)就是代碼比較難讀,庫(kù)的結(jié)構(gòu)也比較復(fù)雜,每個(gè)算法的相干性不是很高,代碼運(yùn)行的效率不是很高。

支持的文件讀取:里面每一種數(shù)據(jù)結(jié)構(gòu)都基本上有自己的文件格式,但是大多數(shù)還是支持ply,xyz,off等。

  • Open3d

Open3D 是一個(gè)可以支持 3D 數(shù)據(jù)處理軟件快速開(kāi)發(fā)的開(kāi)源庫(kù)。Open3D 前端公開(kāi)了一組用 C++ 和 Python 寫(xiě)成的精心挑選的數(shù)據(jù)結(jié)構(gòu)和算法,后端高度優(yōu)化并設(shè)置為并行。代碼較整潔,而且維護(hù)程度較高。作為intel的2018才公布的開(kāi)源項(xiàng)目,在點(diǎn)云、網(wǎng)格、rgbd數(shù)據(jù)上都有支持,雖然現(xiàn)在的開(kāi)源的算法較少,估計(jì)日后在3D視覺(jué)領(lǐng)域如同opencv在2d圖像一樣的流行吧,畢竟PCL是學(xué)校學(xué)生維護(hù)的(基本上不維護(hù)了)。

支持的文件讀取:xyz、pts、ply、pcd

總結(jié)

本文主要介紹了一些常見(jiàn)的點(diǎn)云文件的格式以及相關(guān)的3D處理開(kāi)源算法庫(kù)。目的主要是為了了解這些格式,加深對(duì)點(diǎn)云組成的理解,以及方便日后讀取文件時(shí)進(jìn)行查看。


重要的事情說(shuō)三遍:

如果您看到我的文章對(duì)您有所幫助,那就點(diǎn)個(gè)贊唄 ( * ^ __ ^ * )

如果您看到我的文章對(duì)您有所幫助,那就點(diǎn)個(gè)贊唄( * ^ __ ^ * )

如果您看到我的文章對(duì)您有所幫助,那就點(diǎn)個(gè)贊唄( * ^ __ ^ * )

傳統(tǒng)2D計(jì)算機(jī)視覺(jué)學(xué)習(xí)筆記目錄------->傳送門(mén)
傳統(tǒng)3D計(jì)算機(jī)視覺(jué)學(xué)習(xí)筆記目錄------->傳送門(mén)

任何人或團(tuán)體、機(jī)構(gòu)全部轉(zhuǎn)載或者部分轉(zhuǎn)載、摘錄,請(qǐng)保留本博客鏈接或標(biāo)注來(lái)源。博客地址:開(kāi)飛機(jī)的喬巴

作者簡(jiǎn)介:開(kāi)飛機(jī)的喬巴(WeChat:zhangzheng-thu),現(xiàn)主要從事機(jī)器人抓取視覺(jué)系統(tǒng)以及三維重建等3D視覺(jué)相關(guān)方面,另外對(duì)slam以及深度學(xué)習(xí)技術(shù)也頗感興趣,歡迎加我微信或留言交流相關(guān)工作。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • ★Windows環(huán)境下的文件后綴名絕大多數(shù)DOS文件名后綴在Windows下繼續(xù)有效,但Windows本身也引出了...
    jianghu000閱讀 1,522評(píng)論 0 5
  • 一、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 5,803評(píng)論 0 10
  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說(shuō)明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常。 O...
    我想起個(gè)好名字閱讀 5,429評(píng)論 0 9
  • 自律的人生活充實(shí)而美好。 自從進(jìn)入易根大學(xué),自己每天都是早上五點(diǎn)打卡,每天早起聽(tīng)早課或分享自己的心得體會(huì),...
    育心經(jīng)典易根大學(xué)曲鳳閱讀 235評(píng)論 1 0