[日知录18]pcl点云

pcl入门

环境搭建

参考博文 https://blog.csdn.net/weixin_53660567/article/details/119871890
我的环境的win11虚拟机VMware中安装ubuntu20.04系统,
这里就很大的感受到ubuntu的优点,如果在win10中安装pcl,估计是要一天来检查配置一些依赖和路径,但是在ubuntu下,只要一行代码。
原本还想在win10里面配置一番,但看到一堆依赖就头疼。

sudo apt install libpcl-dev

完成安装。

在测试时,我参考的是这篇博文。
https://blog.csdn.net/qq_41092406/article/details/117930972
[日知录18]pcl点云_第1张图片
一个绚烂的图形就此出现。
在Ubuntu中使用vscode编译pcl文件时会出现,无法包含头文件路径的错误,暂时不知道怎么改。所以还是在win下配置pcl环境。

vs2019 安装pcl1.12.1 win11 可用

if stream 使用

string中c_str()的用法

[日知录18]pcl点云_第2张图片

C26485 NO_ARRAY_TO_POINTER_DECAY
遇到bug,是与数组越界之类有关的,对于cloud_out这个指针类型的点云数据,可以看作是指针数组。即数组中每一个元素都是指针变量。
图示报错那一行是因为将数值赋给了指针,且当前的指针数组没有定义大小

点云数据的定义一些参考资料

resize的用法
定义1
定义2
不同类型之间点云的转换
点云复制

C++指针数组和数组指针

 PointCloud是PCL中的一个基类,pcl::PointCloud<pcl::PointXYZ>::Ptr是一个Boost共享指针

  PointCloud中的数据域  

    width(int),如果是无组织,无结构的点云数据,表示点云的个数;如果是有结构的点云数据,表示点云数据集一行的点数。
    height(int),如果是无结构的点云数据,height=1;如果是有结构的点云数据,height表示点云总行数。
    points(std::vector)存储了数据类型为PointT的一个动态数组。
  PointXYZ 是最常见的一个点数据类型,它只包含三维X,Y,Z坐标信息
    X:points[i].x
  size_t 整型,保存一个整数,记录一个大小(size)
  points.size() 表示点云数据大小
 cloud_out->points.resize(cloud->size());//加上这一句之后就不报错了

主要问题是在于没有对点云数据的大小进行初始化,以至于指针在指向时会报错。
创建

#include 
#include 
#include 

int
main(int argc,char**argv)
{
pcl::PointCloud<pcl::PointXYZ> cloud;
// 创建点云
cloud.width=5;
cloud.height=1;
cloud.is_dense=false;
cloud.points.resize(cloud.width*cloud.height);
for(size_t i=0;i<cloud.points.size();++i)
{
cloud.points[i].x=1024*rand()/(RAND_MAX+1.0f);
cloud.points[i].y=1024*rand()/(RAND_MAX+1.0f);
cloud.points[i].z=1024*rand()/(RAND_MAX+1.0f);
}
pcl::io::savePCDFileASCII("test_pcd.pcd",cloud);
std::cerr<<"Saved "<<cloud.points.size()<<" data points to test_pcd.pcd."<<std::endl;
for(size_t i=0;i<cloud.points.size();++i)
std::cerr<<"    "<<cloud.points[i].x<<" "<<cloud.points[i].y<<" "<<cloud.points[i].z<<std::endl;
return(0);
}

读写

#include 
#include 
#include 

int
main(int argc,char** argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);

if(pcl::io::loadPCDFile<pcl::PointXYZ>("test_pcd.pcd",*cloud)==-1)//*打开点云文件
{
PCL_ERROR("Couldn't read file test_pcd.pcd\n");
return(-1);
}
std::cout<<"Loaded "
<<cloud->width*cloud->height
<<" data points from test_pcd.pcd with the following fields: "
<<std::endl;
for(size_t i=0;i<cloud->points.size();++i)
std::cout<<"    "<<cloud->points[i].x
<<" "<<cloud->points[i].y
<<" "<<cloud->points[i].z<<std::endl;

return(0);
}

你可能感兴趣的:(笔记,c++)