如何在PCL中添加自定义点类型

        在PCL(Point Cloud Library)中添加新的点类型可以使您自定义点云数据结构以适应特定需求。

定义新的点类型

        首先,我们需要定义一个新的点类型结构。例如:

struct MyPointType
{
  float test;
};

包含模板头文件

        为了确保您的新点类型能够与PCL中的特定类或算法(如 pcl::PassThrough)一起使用,您需要包含该类或算法的模板头文件。您需要在包含任何PCL头文件之前定义 PCL_NO_PRECOMPILE

#define PCL_NO_PRECOMPILE
#include <pcl/filters/passthrough.h>
#include <pcl/filters/impl/passthrough.hpp>

// 其他代码

注意:如果不定义#define PCL_NO_PRECOMPILE 会出现报错

/usr/bin/ld: CMakeFiles/main.dir/main.cpp.o: in function `pcl::Filter<RadarPoint>::Filter(bool)':
main.cpp:(.text._ZN3pcl6FilterI10RadarPointEC2Eb[_ZN3pcl6FilterI10RadarPointEC5Eb]+0x20): undefined reference to `pcl::PCLBase<RadarPoint>::PCLBase()'
/usr/bin/ld: CMakeFiles/main.dir/main.cpp.o:(.data.rel.ro._ZTVN3pcl11PassThroughI10RadarPointEE[_ZTVN3pcl11PassThroughI10RadarPointEE]+0x20): undefined reference to `pcl::PCLBase<RadarPoint>::setInputCloud(std::shared_ptr<pcl::PointCloud<RadarPoint> const> const&)'
/usr/bin/ld: CMakeFiles/main.dir/main.cpp.o:(.data.rel.ro._ZTVN3pcl11PassThroughI10RadarPointEE[_ZTVN3pcl11PassThroughI10RadarPointEE]+0x28): undefined reference to `pcl::PCLBase<RadarPoint>::setIndices(std::shared_ptr<std::vector<int, std::allocator<int> > > const&)'
/usr/bin/ld: CMakeFiles/main.dir/main.cpp.o:(.data.rel.ro._ZTVN3pcl11PassThroughI10RadarPointEE[_ZTVN3pcl11PassThroughI10RadarPointEE]+0x30): undefined reference to `pcl::PCLBase<RadarPoint>::setIndices(std::shared_ptr<std::vector<int, std::allocator<int> > const> const&)'
/usr/bin/ld: CMakeFiles/main.dir/main.cpp.o:(.data.rel.ro._ZTVN3pcl11PassThroughI10RadarPointEE[_ZTVN3pcl11PassThroughI10RadarPointEE]+0x38): undefined reference to `pcl::PCLBase<RadarPoint>::setIndices(std::shared_ptr<pcl::PointIndices const> const&)'

         下面的代码示例创建了一个包含XYZ数据(带有SSE填充)和一个测试浮点数的新点类型。

#define PCL_NO_PRECOMPILE
#include <pcl/memory.h>
#include <pcl/pcl_macros.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>

// 定义新的点类型
struct EIGEN_ALIGN16 MyPointType    // 强制SSE填充以确保内存对齐
{
  PCL_ADD_POINT4D;                  // 添加XYZ和填充字段的首选方式
  float test;
  PCL_MAKE_ALIGNED_OPERATOR_NEW     // 确保新的分配器是对齐的
};

// 注册新的点类型
POINT_CLOUD_REGISTER_POINT_STRUCT (MyPointType,           // 假设有XYZ + "test"字段
                                   (float, x, x)
                                   (float, y, y)
                                   (float, z, z)
                                   (float, test, test)
)

int main (int argc, char** argv)
{
  pcl::PointCloud<MyPointType> cloud;
  cloud.resize(2);
  cloud.width = 2;
  cloud.height = 1;

  cloud[0].test = 1.0f;
  cloud[1].test = 2.0f;
  cloud[0].x = cloud[0].y = cloud[0].z = 0.0f;
  cloud[1].x = cloud[1].y = cloud[1].z = 3.0f;

  pcl::io::savePCDFile("test.pcd", cloud);
  return 0;
}

 

详细步骤

  1. 定义点类型:创建一个结构体来定义新的点类型,包括所需的字段和对齐要求。
  2. 包含头文件:确保定义 PCL_NO_PRECOMPILE 并包含所需的PCL模板头文件。
  3. 注册点类型:使用 POINT_CLOUD_REGISTER_POINT_STRUCT 宏来注册新的点类型。
  4. 使用点类型:在代码中使用新的点类型,例如创建点云、设置点数据和保存PCD文件。

结论

        通过定义和注册新的点类型,可以根据具体需求自定义点云数据结构。这使得PCL更加灵活和强大,能够处理各种复杂的点云处理任务。

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
自定义一个名为 `PointXYZRGBAI` 的点云类型,可以按以下步骤操作: 1. 创建一个名为 `PointXYZRGBAI` 的结构体,该结构体包含以下字段: ```cpp struct PointXYZRGBAI { PCL_ADD_POINT4D; // 添加 X、Y、Z 坐标 union { struct { uint8_t b; uint8_t g; uint8_t r; uint8_t a; uint8_t i; }; float rgbai; }; EIGEN_MAKE_ALIGNED_OPERATOR_NEW // 保证内存对齐 } EIGEN_ALIGN16; ``` 2. 使用 `PCL_ADD_POINT4D` 宏添加 X、Y、Z 坐标。这个宏会自动添加 `x`、`y`、`z` 字段和一些方法,用于操作这些字段。 3. 添加 `b`、`g`、`r`、`a` 和 `i` 字段,这些字段分别表示的颜色和透明度以及其它属性。这些字段也可以用 `rgbai` 字段来表示,它是一个 `float` 类型的联合体,可以直接访问这些字段。 4. 使用 `EIGEN_MAKE_ALIGNED_OPERATOR_NEW` 宏来保证内存对齐。 下面是完整的代码示例: ```cpp #include <pcl/point_types.h> struct PointXYZRGBAI { PCL_ADD_POINT4D; // 添加 X、Y、Z 坐标 union { struct { uint8_t b; uint8_t g; uint8_t r; uint8_t a; uint8_t i; }; float rgbai; }; EIGEN_MAKE_ALIGNED_OPERATOR_NEW // 保证内存对齐 } EIGEN_ALIGN16; POINT_CLOUD_REGISTER_POINT_STRUCT(PointXYZRGBAI, (float, x, x) (float, y, y) (float, z, z) (uint32_t, rgba, rgba) (uint8_t, i, i)) ``` 在注册点云类型时,可以使用 `POINT_CLOUD_REGISTER_POINT_STRUCT` 宏来注册 `PointXYZRGBAI` 类型。注意,`rgba` 字段必须使用 `uint32_t` 类型表示,因为 PCL 内部使用 32 位整数来表示颜色。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云兔子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值