点的类型有
#include <pcl/point_types.hpp>
pcl::PointXYZ
pcl::PointXYZI
pcl::PointXYZRGB
pcl::PointXYZHSV
点云类型
#include <pcl/point_cloud.h>
PointCloud类型:以std::vector<PointT, Eigen::aligned_allocator<PointT> > points为数据存储,自己又套了一层API
#include <pcl/PCLPointCloud2.h>
PCLPointCloud2类型:二进制存储的点云类型std::vector<pcl::uint8_t> data;。按编码(std::vector<pcl::PCLPointField> fields;)对应data中各位段的意义。
点云类型基本操作
/* 常用成员 */
//pcl库的所有类型都有Ptr对应std::share_ptr和ConstPtr
pcl::PointCloud<pcl::PointXYZ>::Ptr;
pcl::PCLPointCloud2<pcl::PointXYZ>::Ptr;
pcl::visualization::PCLVisualizer::Ptr;
-----------------------------------------------------------------------------------------------
/* 常用运算 */
//直接拼接融合
+= 和+
//访问元素
pc(row,col)或pc.at(row,col)其中at是带保护的。且只有height>=0才能使用这两个方法(按2D图像方式存储)
而pc[i],访问pc中存储vector的第i个值。或pc.point.data()返回首地址
//遍历
由于点云实际是vector实现的所以可以使用标准遍历形式
for(auto item:PC){}
//数据流重载
<<可以直接输出
点云类型之间的转换
/* ros的sensor_msgs::PointCloud2和pcl的点云转换 */
#include <pcl_conversions/pcl_conversions.h>
pcl::fromROSMsg(ros_pc,pcl_pc)
pcl::moveFromROSMsg(ros_pc,pcl_pc)//尽量不用,这是把ros_pc的以指针形式和内部中间临时变量交换,再拷贝给pcl_pc。使用后pcl_pc是一个野指针。
pcl::toROSMsg(pcl_pc,ros_pc)//记得修改转换后ros_pc的stamped。或在转换器给pcl_pc的stamped赋值
pcl::moveToROSMsg(pcl_pc,ros_pc)//同上使用后pcl_pc是一个野指针。
-----------------------------------------------------------------------------------------------
/* pcl::pointcloud和pclpointcloud2转换 */
pcl::toPCLPointCloud2(pc,pc2);
pcl::fromPCLPointCloud2(pc2,pc);
点云拷贝
//不必外部初始化或为output甚至内存,直接覆盖掉元数据
pcl::copyPointCloud(intut,output)
网友评论