PCL常見程式設計問題
【原文:http://www.zhangzscn.com/2015/11/27/pcl開源庫常見程式設計問題/】
針對大家在利用PCL開源進行開發過程中的常見問題,進行解答。本文會長期更新。
1.如何獲取pcd檔案點雲裡點的格式,比如是pcl::PointXYZ還是pcl::PointXYZRGB等型別?
1
2
3
4
5
6
7
8
9
10
11
12
|
#include
<pcl/io/pcd_io.h> #include
<pcl/point_types.h> #include
<pcl/point_cloud.h> #include
<pcl/PCLPointCloud2.h> pcl::PCLPointCloud2
cloud; pcl::PCDReader
reader; reader.readHeader( "C:\fandisk.pcd" ,
cloud); for
( int
i = 0; i < cloud.fields.size(); i++) { std::cout
<< cloud.fields[i].name; } |
2.如何實現類似pcl::PointCloud::Ptr和pcl::PointCloud的兩個類相互轉換?
1
2
3
4
5
6
7
8
|
#include
<pcl/io/pcd_io.h> #include
<pcl/point_types.h> #include
<pcl/point_cloud.h> pcl::PointCloud<pcl::PointXYZ>::Ptr
cloudPointer( new
pcl::PointCloud<pcl::PointXYZ>); pcl::PointCloud<pcl::PointXYZ>
cloud; cloud
= *cloudPointer; cloudPointer
= cloud.makeShared(); |
3.如何加快ASCII格式儲存,也就是記事本開啟可以看到座標資料的pcd檔案讀取速度?
建議將pcd檔案換成以Binary格式儲存。
1
2
3
4
5
6
7
8
|
#include
<pcl/io/pcd_io.h> #include
<pcl/point_types.h> #include
<pcl/point_cloud.h> #include
<pcl/PCLPointCloud2.h> pcl::PointCloud<pcl::PointXYZ>::Ptr
cloud( new
pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile<pcl::PointXYZ>( "C:\office3-after1.pcd" ,
*cloud); pcl::io::savePCDFileBinary( "C:\office3-after21111.pcd" ,
*cloud); |
4.如何給pcl::PointXYZ型別的點雲在顯示時指定顏色?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include
<pcl/io/pcd_io.h> #include
<pcl/point_types.h> #include
<pcl/point_cloud.h> #include
<pcl/visualization/pcl_visualizer.h> pcl::PointCloud<pcl::PointXYZ>::Ptr
cloud( new
pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile<pcl::PointXYZ>( "C:\office3-after21111.pcd" ,
*cloud); pcl::visualization::PCLVisualizer
viewer( "pointcloud
viewer" ); pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>
sig(cloud, 0, 234, 0); viewer.addPointCloud(cloud,
sig, "cloud" ); while
(!viewer.wasStopped()) { viewer.spinOnce(); } |
5.如何查詢點雲的x,y,z的極值?
1
2
3
4
5
6
7
8
|
#include
<pcl/io/pcd_io.h> #include
<pcl/point_types.h> #include
<pcl/common/common.h> pcl::PointCloud<pcl::PointXYZ>::Ptr
cloud; cloud
= pcl::PointCloud<pcl::PointXYZ>::Ptr ( new
pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile<pcl::PointXYZ>
( "your_pcd_file.pcd" ,
*cloud); pcl::PointXYZ
minPt, maxPt; pcl::getMinMax3D
(*cloud, minPt, maxPt); |
6.如何判斷點雲中的點為無效點,即座標值為nan,以及如何將點設定為無效點?
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include
<pcl/point_types.h> pcl::PointXYZ
p_valid; p_valid.x
= 0; p_valid.y
= 0; p_valid.z
= 0; std::cout
<< "Is
p_valid valid? "
<< pcl::isFinite(p_valid) << std::endl; pcl::PointXYZ
p_invalid; p_invalid.x
= std::numeric_limits< float >::quiet_NaN(); p_invalid.y
= 0; p_invalid.z
= 0; std::cout
<< "Is
p_invalid valid? "
<< pcl::isFinite(p_invalid) << std::endl; |
7.如何將無效點從點雲中移除?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#include
<pcl/point_cloud.h> #include
<pcl/point_types.h> #include
<pcl/filters/filter.h> typedef
pcl::PointCloud<pcl::PointXYZ> CloudType; CloudType::Ptr
cloud( new
CloudType); cloud->is_dense
= false ; CloudType::Ptr
output_cloud( new
CloudType); CloudType::PointType
p_nan; p_nan.x
= std::numeric_limits< float >::quiet_NaN(); p_nan.y
= std::numeric_limits< float >::quiet_NaN(); p_nan.z
= std::numeric_limits< float >::quiet_NaN(); cloud->push_back(p_nan); CloudType::PointType
p_valid; p_valid.x
= 1.0f; cloud->push_back(p_valid); std::cout
<< "size:
"
<< cloud->points.size() << std::endl; std::vector< int >
indices; pcl::removeNaNFromPointCloud(*cloud,
*output_cloud, indices); std::cout
<< "size:
"
<< output_cloud->points.size() << std::endl; |
8.如果知道需要儲存點的序號,如何從原點雲中拷貝點到新點雲?
1
2
3
4
5
6
7
8
9
10
|
#include
<pcl/io/pcd_io.h> #include
<pcl/common/impl/io.hpp> #include
<pcl/point_types.h> #include
<pcl/point_cloud.h> pcl::PointCloud<pcl::PointXYZ>::Ptr
cloud( new
pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile<pcl::PointXYZ>( "C:\office3-after21111.pcd" ,
*cloud); pcl::PointCloud<pcl::PointXYZ>::Ptr
cloudOut( new
pcl::PointCloud<pcl::PointXYZ>); std::vector< int
> indexs = { 1, 2, 5 }; pcl::copyPointCloud(*cloud,
indexs, *cloudOut); |
9.如何從點雲裡刪除和新增點?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include
"stdafx.h" #include
<pcl/io/pcd_io.h> #include
<pcl/common/impl/io.hpp> #include
<pcl/point_types.h> #include
<pcl/point_cloud.h> pcl::PointCloud<pcl::PointXYZ>::Ptr
cloud( new
pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile<pcl::PointXYZ>( "C:\office3-after21111.pcd" ,
*cloud); pcl::PointCloud<pcl::PointXYZ>::iterator
index = cloud->begin(); cloud->erase(index); //刪除第一個 index
= cloud->begin() + 5; cloud->erase(cloud->begin()); //刪除第5個 pcl::PointXYZ
point = { 1, 1, 1 }; //在索引號為5的位置1上插入一點,原來的點後移一位 cloud->insert(cloud->begin()
+ 5, point); cloud->push_back(point); //從點雲最後面插入一點 std::cout
<< cloud->points[5].x; //輸出1 |
如果刪除的點太多建議用上面的方法拷貝到新點雲,再賦值給原點雲,如果要新增很多點,建議先resize,然後用迴圈向點雲裡的新增。
10.PointCloud和PCLPointCloud2型別如何相互轉換?
1
2
3
4
5
6
7
8
|
#include
<pcl/io/pcd_io.h> #include
<pcl/point_types.h> pcl::PointCloud<pcl::PointXYZ>::Ptr
cloud( new
pcl::PointCloud<pcl::PointXYZ>); pcl::PCLPointCloud2
cloud2; pcl::io::loadPCDFile( "C:\office3-after21111.pcd" ,
cloud2); pcl::fromPCLPointCloud2(cloud2,
*cloud); pcl::toPCLPointCloud2(*cloud,
cloud2); |
相關文章
- Java程式設計師面試常見問題Java程式設計師面試
- Java程式設計常見問題彙總Java程式設計
- Python程式設計常見問題與解答Python程式設計
- Java程式設計常見問題彙總(一)Java程式設計
- 網頁設計常見問題網頁
- 好程式設計師分享:Java面試題常見問題程式設計師Java面試題
- Linux TCP程式設計常見問題考慮LinuxTCP程式設計
- 程式設計師世界常見的6個問題程式設計師
- 5年程式設計師面試,常見面試問題解析程式設計師面試
- Python爬蟲程式設計常見問題解決方法Python爬蟲程式設計
- 常見的幾個Qt程式設計問題的處理QT程式設計
- Python教程之網路程式設計及前端常見問題!Python程式設計前端
- PCL程式設計-法向量計算程式設計
- 設計模式常見面試題設計模式面試題
- Linux網路程式設計常見面試題Linux程式設計面試題
- 好程式設計師Python教程分享Python常見面試問題程式設計師Python面試
- 程式設計師的這些常見健康問題,你瞭解了麼?程式設計師
- 低程式碼專案建設常見問題解析
- CodeReview常見程式碼問題View
- socket程式設計中常見的概念問題!程式設計
- 好程式設計師web前端分享常見面試題程式設計師Web前端面試題
- 好程式設計師大資料培訓之Hadoop常見問題程式設計師大資料Hadoop
- 基於RequireJS和JQuery的模組化程式設計——常見問題解析UIJSjQuery程式設計
- 【Nginx】常見問題Nginx
- js常見問題JS
- CSS常見問題CSS
- Git 常見問題Git
- PHP 常見問題PHP
- swiper常見問題
- nginx 常見問題Nginx
- java 常見問題Java
- MyBatis常見問題MyBatis
- 前端常見問題前端
- Git常見問題Git
- SQLServer常見問題SQLServer
- css 常見問題CSS
- HTML常見問題HTML
- PyMongo 常見問題Go