PCL常見編程問題


1.如何獲取pcd文件點雲里點的格式,比如是pcl::PointXYZ還是pcl::PointXYZRGB等類型?

#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的兩個類相互轉換?

#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格式存儲。

 

#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類型的點雲在顯示時指定顏色?

#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的極值?

#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,以及如何將點設置為無效點?

#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.如何將無效點從點雲中移除?

#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.如果知道需要保存點的序號,如何從原點雲中拷貝點到新點雲?

 

#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.如何從點雲里刪除和添加點?

#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類型如何相互轉換?

#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);

轉自http://www.zhangzscn.com/2015/11/27/pcl%E5%BC%80%E6%BA%90%E5%BA%93%E5%B8%B8%E8%A7%81%E7%BC%96%E7%A8%8B%E9%97%AE%E9%A2%98/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM