目錄
2.1 IO模塊接口
2.2?PCD數(shù)據(jù)讀寫
(1) PCD數(shù)據(jù)解析
(2)PCD文件讀寫示例
2.3?PLY數(shù)據(jù)讀寫
(1)PLY數(shù)據(jù)解析
(2)PLY文件讀寫示例
2.4 OBJ數(shù)據(jù)讀寫
(1)OBJ數(shù)據(jù)解析
(2)OBJ文件讀寫示例
2.5?VTK數(shù)據(jù)讀寫
(1)VTK數(shù)據(jù)解析
(2)VTK文件讀寫示例
2.6 保存為PNG
2.1 IO模塊接口
參考文章:PCL函數(shù)庫摘要——IO模塊_pcl/io_悠緣之空的博客-CSDN博客
(1)Class pcl::FileReader
類FileReader定義了PCD文件的讀取接口,主要用做其他讀取類的父類。
(2)Class pcl::FileWriter
類FileWriter 與 FileReader對應(yīng),是寫人PCD文件的類接口定義,可以作為其它寫入類的父類。
(3)Class pcl::Grabber
類Grabber為PCL1.X對應(yīng)的設(shè)備驅(qū)動接口的基類定義。
(4)Class openni_wrapper::OpenNIDevice
類OpenNIDevice定義OpenNI設(shè)備的基類,繼承該基類可以實現(xiàn)不同的OpenNI設(shè)備子類,用于獲取包括紅外數(shù)據(jù)、RGB數(shù)據(jù)、深度圖像數(shù)據(jù)等。
(5)Class openni_wrapper::DeviceKinect
(6)Class openni_wrapper::DevicePrimesense
(7)Class openni_wrapper::DeviceXtionPro
以上3個類分別封裝了Kinect,Primesense,XtionPro相關(guān)設(shè)備操作和數(shù)據(jù)獲取操作實現(xiàn),其詳細(xì)接口參考其父類OpenNIDevice的關(guān)鍵函數(shù)說明。
(8)Class openni_wrapper::DeviceONI
封裝了利用ONI文件回放虛擬類kinect設(shè)備的操作和數(shù)據(jù)獲取操作實現(xiàn),其詳細(xì)接口參考其父類OpenNIDevice的關(guān)鍵函數(shù)說明。
(9)Class openni_wrapper::OpenNIDriver
類OpenNIDriver采用單例模式實現(xiàn)對底層驅(qū)動的封裝,里面包含一xn::Context對象,提供給所有設(shè)備使用。該類提供了枚舉和訪問所有設(shè)備的方法實現(xiàn)。
(10)Class openni_wrapper::OpenNIException
類OpenNIException封裝一般的異常處理實現(xiàn)。
(11)Class openni_wrapper::Image
類Image是簡單的圖像數(shù)據(jù)封裝基類。
(12)Class openni_wrapper::ImageBayerGRBG
(13)Class openni_wrapper::ImageRGB24
(14)Class openni_wrapper::ImageYUV422 Class Reference
以上3個類分別實現(xiàn)了對原始數(shù)據(jù) BayerGRBG ,RGB24、YUV422到圖像轉(zhuǎn)化接口,詳細(xì)參考其父類關(guān)鍵函數(shù)說明。
(15)Class pcl::OpenNIGrabber
類OpenNIGrabber 實現(xiàn)對OpenNI設(shè)備(例如Primesense PSDK,MicrosoftKinect,Asus XTion Pro/Live)數(shù)據(jù)的采集接口,詳細(xì)參考其父類Grabber 關(guān)鍵函數(shù)說明。
(16)Class pcl::PCDReader
(17)Class pcl::PLYReader
以上兩個類分別是PCD、PLY文件格式讀入接口的實現(xiàn),詳細(xì)參考其父類pcl: :FileReader。
(18)Class pcl::PLYWriter
(19)Class pcl::PCDWriter
以上兩個類分別是PCD、PLY文件格式寫出接口的實現(xiàn),詳細(xì)參考其父類pcl: :FileWriter。
(20)Class pcl::io::IOException
類pcl::io::IOException 是I/O相關(guān)的異常處理接口實現(xiàn),詳細(xì)參考其父類PCLEx-ception。
(21)I/O模塊其他關(guān)鍵成員
2.2?PCD數(shù)據(jù)讀寫
(1) PCD數(shù)據(jù)解析
# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7
FIELDS x y z _
SIZE 4 4 4 1
TYPE F F F U
COUNT 1 1 1 4
WIDTH 112099
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 112099
DATA binary
- VERSION 0.7:指定pcd文件的版本。
- FIELDS:指定每個點可以具有的維度,以及每個維度所代表的含義。例如:FIELDS x y z r g b表示該點的位置信息(x,y,z),顏色信息(r,g,b)。
- SIZE:以字節(jié)為單位指定每個數(shù)據(jù)所占用的內(nèi)存。
- TYPE:指定每個數(shù)據(jù)的數(shù)據(jù)類型。其中無效的點的通常存儲為NAN類型。
????????????I:可表示int8,int16,int32。
????????????U:可表示uint8,unit16,uint32。
????????????F:表示float(上圖所用的為浮點類型)。
- COUNT:指定每個維度有多少元素。例如xyz數(shù)據(jù)通常只有一個元素。
- WIDTH:指定數(shù)據(jù)點的寬度,它包含兩個含義:(1)可指定點云總個數(shù)(與POINTS相同),用于無組織的數(shù)據(jù)。(2)可指定有組織點云數(shù)據(jù)的寬度(連續(xù)點的總數(shù))。
- HEIGTH:?指定數(shù)據(jù)點的高度,它包含兩個含義:(1)可指定有組織的點云數(shù)據(jù)的高度(總行數(shù))。(2)對未組織的數(shù)據(jù),它被設(shè)置為1。
- POINTS:指定點云總個數(shù)。
- VIEWPOINT:采集數(shù)據(jù)時的視點(由平移tx,ty,tz和四元數(shù)qw,qx,qy,qz組成)。
- DATA:點云數(shù)據(jù)存儲的數(shù)據(jù)類型(支持ascii和binary)。如果以ASCII形式,每一點占據(jù)一個新行。
(2)PCD文件讀寫示例
cmake_minimum_required(VERSION 2.6)
project(pcd)
find_package(PCL 1.10 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
add_executable(pcd pcd.cpp)
target_link_libraries (pcd ${PCL_LIBRARIES})
install(TARGETS pcd RUNTIME DESTINATION bin)
#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
using namespace std;
int main()
{
pcl::PCDReader reader;
pcl::PCLPointCloud2 org;
pcl::io::loadPCDFile("../pcdfile.pcd",org);
for(auto &f : org.fields)
cout << f.name;
pcl::PointCloud<pcl::PointXYZ> cloud;
pcl::fromPCLPointCloud2<pcl::PointXYZ>(org,cloud);
pcl::PCDWriter writer;
pcl::io::savePCDFileBinaryCompressed("../savepcdfile.pcd",cloud);
pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer);
viewer->setWindowName("PCDFile");
viewer->addPointCloud(cloud.makeShared());
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
}
return 0;
}
2.3?PLY數(shù)據(jù)讀寫
(1)PLY數(shù)據(jù)解析
典型的PLY文件結(jié)構(gòu):
- 頭部
- 頂點列表
- 面片列表
- 其他元素列表
ply
format ascii 1.0
element vertex 14806
property float x
property float y
property float z
property float nx
property float ny
property float nz
element face 0
property list uchar int vertex_indices
end_header
0.91441 -0.536438 0.822624 -0.0442205 -0.930906 0.362575
0.933494 -0.545228 0.820276 0.073409 -0.981856 0.174844
...
(2)PLY文件讀寫示例
cmake_minimum_required(VERSION 2.6)
project(ply)
find_package(PCL 1.10 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
add_executable(ply ply.cpp)
target_link_libraries (ply ${PCL_LIBRARIES})
install(TARGETS ply RUNTIME DESTINATION bin)
#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/io/ply_io.h>
#include <pcl/visualization/pcl_visualizer.h>
using namespace std;
int main()
{
pcl::PCLPointCloud2 cloud;
pcl::io::loadPLYFile("../ply.ply",cloud);
pcl::PLYReader reader;
pcl::PLYWriter writer;
pcl::PointCloud<pcl::PointXYZ> cloud1;
pcl::fromPCLPointCloud2<pcl::PointXYZ>(cloud,cloud1);
pcl::io::savePLYFile("saveply.ply",cloud,Eigen::Vector4f::Zero (),
Eigen::Quaternionf::Identity (),
true);
pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer);
viewer->setWindowName("PLYFile");
pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> color(cloud1.makeShared(), "y");
viewer->addPointCloud(cloud1.makeShared(),color);
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,2);
while(!viewer->wasStopped())
viewer->spinOnce(100);
return 0;
}
2.4 OBJ數(shù)據(jù)讀寫
(1)OBJ數(shù)據(jù)解析
mtllib cube.mtl
g default
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
v 0.500000 -0.500000 -0.500000
vt 0.001992 0.001992
vt 0.998008 0.001992
vt 0.001992 0.998008
vt 0.998008 0.998008
...
mtllib:代表材質(zhì)庫,通常指向到某個mtl文件
- v(vertices):幾何形狀的頂點,因為物體是由面構(gòu)成的,而面是由線構(gòu)成的,線由點構(gòu)成的,所以無論是何形狀,都必須要有幾何頂點;一些應(yīng)用支持頂點顏色,通過在x y z后面跟上red, green, blue值來表示。顏色值的范圍為0到1.0。
- vt(vertex texture):頂點紋理,代表當(dāng)前頂點對應(yīng)紋理圖的哪個像素,通常是0-1,如果大于1,就相當(dāng)于將紋理重新擴充然后取值,比如鏡像填充、翻轉(zhuǎn)填充之類的,然后根據(jù)紋理圖的寬高去計算具體像素位置
- vn(vertex normal):頂點法線,物理里面有說過眼睛看到物體是因為光線經(jīng)過物體表面反射到眼睛,所以這個法線就是通過入射光線計算反射光線使用的法線。
- f(face):大部分幾何體都包括面,除非是像頭發(fā)絲那一類模型只包含一根根頭發(fā)的頂點,而且大部分模型的頭發(fā)也用的面片的方法渲染的。
? ? ? ? 其他參考:obj格式解析_obj格式詳解_風(fēng)翼冰舟的博客-CSDN博客
(2)OBJ文件讀寫示例
cmake_minimum_required(VERSION 2.6)
project(obj)
find_package(PCL 1.10 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
add_executable(obj obj.cpp)
target_link_libraries (obj ${PCL_LIBRARIES})
install(TARGETS obj RUNTIME DESTINATION bin)
#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/io/obj_io.h>
#include <pcl/visualization/pcl_visualizer.h>
using namespace std;
int main()
{
pcl::PolygonMesh mesh;
pcl::PCLPointCloud2 cloud;
pcl::TextureMesh tmesh;
#if 0
pcl::io::loadOBJFile("../obj.obj",cloud);
pcl::io::loadOBJFile("../obj.obj",mesh);
pcl::io::loadOBJFile("../obj.obj",tmesh);
#else
pcl::OBJReader objreader;
objreader.read("../obj.obj",cloud);
objreader.read("../obj.obj",mesh);
objreader.read("../obj.obj",tmesh);
#endif
pcl::io::saveOBJFile("../saveobj.obj",mesh);
pcl::PointCloud<pcl::PointXYZ> cloudxyz;
pcl::fromPCLPointCloud2<pcl::PointXYZ>(cloud,cloudxyz);
pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer);
viewer->setWindowName("OBJFile");
pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> color(cloudxyz.makeShared(), "z");
viewer->addPointCloud(cloudxyz.makeShared(),color);
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,2);
viewer->addPolygonMesh(mesh);
while(!viewer->wasStopped())
viewer->spinOnce(100);
return 0;
}
2.5?VTK數(shù)據(jù)讀寫
(1)VTK數(shù)據(jù)解析
# vtk DataFile Version 2.0
vtk output
ASCII
DATASET POLYDATA
POINTS 2312 float
0.263107 0 0.425176 0.33131 0 0.374478 0.389942 0 0.312962
0.43731 0 0.242405 0.472045 0 0.164845 0.493143 0 0.0825238
- 第一行是說明vtk文件的version(這是legacy 版本,此外還有較新的xml版本)
- 第二行是文件描述,隨便寫什么
- 第三行是ASCII或者BINARY
- 第四行是說明數(shù)據(jù)類型,有STRUCTURED_POINTS,STRUCTURED_GRID,RECTILINEAR_GRID,POLYDATA
- 后面為數(shù)據(jù),它分為三個部分:POINTS 點數(shù)據(jù),CELSS 網(wǎng)格數(shù)據(jù),CELL_TYPES網(wǎng)格類型
?
(2)VTK文件讀寫示例
cmake_minimum_required(VERSION 2.6)
project(vtkfile)
find_package(PCL 1.10 REQUIRED)
find_package(VTK REQUIRED)
include(${VTK_USE_FILE})
link_directories(${VTK_LIBRARY_DIRS})
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
add_executable(vtkfile vtkfile.cpp)
target_link_libraries (vtkfile ${PCL_LIBRARIES} ${VTK_LIBRARIES})
target_link_libraries (vtkfile ${VTK_LIBRARIES})
install(TARGETS vtkfile RUNTIME DESTINATION bin)
#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/io/vtk_io.h>
#include <pcl/io/vtk_lib_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/io/obj_io.h>
using namespace std;
int main()
{
pcl::PCLPointCloud2 cloud;
pcl::PolygonMesh mesh,mesh1,mesh2;
#if 0
pcl::io::loadPolygonFile("../vtk.vt",mesh);
#else
pcl::io::loadPolygonFileVTK("../vtk.vtk",mesh);
pcl::io::loadPolygonFileVTK("../vtk.vtk",mesh2);
#endif
pcl::PointCloud<pcl::PointXYZ> cloudxyz;
pcl::fromPCLPointCloud2<pcl::PointXYZ>(mesh.cloud,cloudxyz);
pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer);
viewer->setWindowName("VTKFile");
pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> color(cloudxyz.makeShared(),"y");
viewer->addPointCloud(cloudxyz.makeShared(),color);
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,3);
viewer->addPolygonMesh(mesh);
while(!viewer->wasStopped())
viewer->spinOnce(100);
return 0;
}
2.6 保存為PNG
#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/png_io.h>
#include <pcl/visualization/pcl_visualizer.h>
using namespace std;
int main()
{
pcl::PCDReader reader;
pcl::PCLPointCloud2 org;
pcl::io::loadPCDFile("../cow.pcd",org);
for(auto &f : org.fields)
cout << f.name << endl;
pcl::PointCloud<pcl::PointXYZ> cloud;
pcl::fromPCLPointCloud2<pcl::PointXYZ>(org,cloud);
pcl::io::savePNGFile("../savepng.png",cloud,"rgb");
pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> color(cloud.makeShared(), "z");
pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer);
viewer->setWindowName("savePNG");
viewer->addPointCloud(cloud.makeShared(),color);
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,2);
while(!viewer->wasStopped())
viewer->spinOnce(100);
return 0;
}}
文章來源:http://www.zghlxwxcb.cn/news/detail-420997.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-420997.html
到了這里,關(guān)于PCL點云庫(2) - IO模塊的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!