PCL常见编程问题

摘要:
建议将pcd文件存储为二进制格式,而不是#include#include#include#includepcl::PointCloud::Ptrcloud;pcl::io::loadPCDFile<pcl:点XYZ>;pcl::io::savePCDFileBinary;4.如何在显示时为pcl::PointXYZ类型的点云指定颜色?观众wasStopped()){viewer.spinOnce();}5。如何找到点云的x、y、z的极值#include#include#包含pcl::PointCloud::Ptrcloud;云=pcl::点云::Ptr;pcl::io::loadPCDFile<pcl:点XYZ>;pcl::点XYZminPt,maxPt;pcl::getMinMax3D;6.如何判断点云中的点为无效点,即坐标值为nan,如何将该点设置为无效点?“˂˂pcl::isFinite˂˂std::endl;7。如何从点云中删除无效点?

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/

免责声明:文章转载自《PCL常见编程问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Visual C++ MFC/ATL开发-提高篇mysql的文件组成以及IO操作的流程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

PCL特征点与配准(1)

关于输入一个具体的物体的点云,从场景中找出与该物体点云相匹配的,这种方法可以用来抓取指定的物体等等,具体的代码的解释如下,需要用到的一些基础的知识,在之前的博客中都有提及,其中用到的一些方法可以翻阅前面的博客,当然有问题可以关注公众号,与众多爱好者一起交流 具体的代码实现 #include <pcl/io/pcd_io.h> #include...

如何在ROS中使用PCL—数据格式(1)

在ROS中点云的数据类型 在ROS中表示点云的数据结构有: sensor_msgs::PointCloud      sensor_msgs::PointCloud2     pcl::PointCloud<T> 关于PCL在ros的数据的结构,具体的介绍可查 看            wiki.ros.org/pcl/Overview 关于s...

03点云文件常用格式转换(pcd,txt,ply,obj,stl)

1.  pcd转txt 1 #include <iostream> 2 #include <fstream> 3 #include <pcl/io/pcd_io.h> 4 5 int main(int argc, char *argv[]) 6 { 7 8 pcl::PointClou...

pcl-常用小知识

pcl-常用小知识 计算时间 #include <pcl/console/time.h> pcl::console::TicToc timer; timer.tic(); //do something std::cout << time.toc() << std::endl; 计算时间的单位为毫米。 查找点云的极值...

ROS之pcl_ros

1 概要:PCL(Point Cloud Library)ROS接口堆,PCL_ROS是在ROS中涉及n维点云和3D几何处理的3D应用的首选桥梁。这个包提供运行ROS和PCL的接口和工具,包括nodelets、nodes和c++接口 2 源码地址: git  https://github.com/ros-perception/perception_pcl....

PCL点云分割(2)

关于点云的分割算是我想做的机械臂抓取中十分重要的俄一部分,所以首先学习如果使用点云库处理我用kinect获取的点云的数据,本例程也是我自己慢慢修改程序并结合官方API 的解说实现的,其中有很多细节如果直接更改源程序,可能会因为数据类型,或者头文件等各种原因编译不过,会导致我们比较难得找出其中的错误,首先我们看一下我自己设定的一个场景,然后我用kinect获...