PCL 新增自定义点云类型

简介: PCL 新增自定义点云类型

pcl 库自身定义了很多中类型的 点云类型变量 。

但是在使用时 如果 希望 使用 自己定义的 点云类型 ,可以 通过 特定的 类 /算法 的模板文件实现

具体代码方法如下:

CMakeList.txt

首先构建 编译文件
使用PCL就这么搞就行了

# 声明要求的 cmake 最低版本
cmake_minimum_required(VERSION 2.8 )
# 添加c++ 11 标准支持
set(CMAKE_CXX_FLAGS "-std=c++11")
# 寻找PCL的库
find_package(PCL REQUIRED COMPONENT common io)
# 添加头文件
include_directories(${PCL_INCLUDE_DIRS})
add_definitions( ${PCL_DEFINITIONS} )
#添加一个可执行程序
add_executable(AddPointStyle_test AddPointStyle.cpp)
#链接PCL 库
target_link_libraries(AddPointStyle_test ${PCL_LIBRARIES})

Code

#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>

需要包换的头文件

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%、

struct MyPointType    //定义点类型结构
{
    PCL_ADD_POINT4D;  //该点类型有4个元素      
 
    /*尝试新增一个自定义*/  
    float JoneAdd;    //定义自己新增的类型名称
     //测试了添加这么多个也没问题
    float JoneAdd1;
    float JoneAdd2;
    float JoneAdd3;
    float JoneAdd4;
    float JoneAdd5;
    float JoneAdd6;
    float JoneAdd7;
    float JoneAdd8;
    float JoneAdd9;

    EIGEN_MAKE_ALIGNED_OPERATOR_NEW   //确保new操作符对齐操作 

}EIGEN_ALIGN16;   //强制SSE 对齐

定义一个结构体 为 自己定义的点 的 结构
在这里插入图片描述
点类型的名称
在这里插入图片描述
PCL_ADD_POINT4D 宏定义(pcl库的) 里面分别有 x、y、z 还有一个对齐变量
在这里插入图片描述
自己定义的 点里包含的变量名称
在这里插入图片描述
测试了可以添加这么多变量也没问题

在这里插入图片描述
pcl的宏定义 直接用就行了

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

POINT_CLOUD_REGISTER_POINT_STRUCT(MyPointType,    //注册点类型宏
    (float ,x,x)
    (float ,y,y)
    (float ,z,z)
    (float ,JoneAdd,JoneAdd)
    (float ,JoneAdd,JoneAdd1)
    (float ,JoneAdd,JoneAdd2)
    (float ,JoneAdd,JoneAdd3)
    (float ,JoneAdd,JoneAdd4)
    (float ,JoneAdd,JoneAdd5)
    (float ,JoneAdd,JoneAdd6)
    (float ,JoneAdd,JoneAdd7)
    (float ,JoneAdd,JoneAdd8)
    (float ,JoneAdd,JoneAdd9)
    )

注册点类型宏
固定步骤
按照上的格式 ,先是上面定义的结构体的名称。后面时点的各变量

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

int main(int argc, char const *argv[])
{
    pcl::PointCloud <MyPointType> cloud;

    cloud.points.resize(2);

    cloud.width=2;

    cloud.height=1;

    cloud.points[0].x=cloud.points[0].y=cloud.points[0].z=1;

    cloud.points[1].x=cloud.points[1].y=cloud.points[1].z=3;

    cloud.points[0].JoneAdd = 1.2;

    cloud.points[1].JoneAdd = 3.4;

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

    return 0;
}

在这里插入图片描述
声明自己定义的点云 变量

在这里插入图片描述
设置点云大小
在这里插入图片描述
赋值点里面的变量,其中包含了常规的 x,y,z

还有自己定义的 JoneAdd

在这里插入图片描述
保存成pcd文件

所有代码

#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>




struct MyPointType    //定义点类型结构
{
    PCL_ADD_POINT4D;  //该点类型有4个元素      
 
    /*尝试新增一个自定义*/  
    float JoneAdd;    //定义自己新增的类型名称
     //测试了添加这么多个也没问题
    float JoneAdd1;
    float JoneAdd2;
    float JoneAdd3;
    float JoneAdd4;
    float JoneAdd5;
    float JoneAdd6;
    float JoneAdd7;
    float JoneAdd8;
    float JoneAdd9;

    EIGEN_MAKE_ALIGNED_OPERATOR_NEW   //确保new操作符对齐操作 

}EIGEN_ALIGN16;   //强制SSE 对齐

POINT_CLOUD_REGISTER_POINT_STRUCT(MyPointType,    //注册点类型宏
    (float ,x,x)
    (float ,y,y)
    (float ,z,z)
    (float ,JoneAdd,JoneAdd)
    (float ,JoneAdd,JoneAdd1)
    (float ,JoneAdd,JoneAdd2)
    (float ,JoneAdd,JoneAdd3)
    (float ,JoneAdd,JoneAdd4)
    (float ,JoneAdd,JoneAdd5)
    (float ,JoneAdd,JoneAdd6)
    (float ,JoneAdd,JoneAdd7)
    (float ,JoneAdd,JoneAdd8)
    (float ,JoneAdd,JoneAdd9)
    )

int main(int argc, char const *argv[])
{
    pcl::PointCloud <MyPointType> cloud;

    cloud.points.resize(2);

    cloud.width=2;

    cloud.height=1;

    cloud.points[0].x=cloud.points[0].y=cloud.points[0].z=1;

    cloud.points[1].x=cloud.points[1].y=cloud.points[1].z=3;

    cloud.points[0].JoneAdd = 1.2;

    cloud.points[1].JoneAdd = 3.4;


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

    return 0;
}

测试

在这里插入图片描述

相关文章
|
10月前
|
SQL 定位技术 API
GEE python:按照矢量中的几何位置、属性名称和字符串去筛选矢量集合
GEE python:按照矢量中的几何位置、属性名称和字符串去筛选矢量集合
110 0
|
Python
ROS节点检测ArUco标签并记录空间坐标
利用Realsense D435i相机检测ArUco标签,使用Python程序订阅相机的ROS话题,记录Time和标签的XYZ值,储存在一个csv文件中;当出现识别不到标签或者反馈坐标为0,0,0的情况时,不进行记录。
354 0
|
5月前
|
JSON 数据格式 计算机视觉
Opencv实用笔记(一): 获取并绘制JSON标注文件目标区域(可单独保存目标小图)
本文介绍了如何使用OpenCV和Python根据JSON标注文件获取并绘制目标区域,同时可将裁剪的图像单独保存。通过示例代码,展示了如何读取图片路径、解析JSON标注、绘制标注框并保存裁剪图像的过程。此外,还提供了相关的博客链接,供读者进一步学习。
107 0
|
6月前
|
存储 并行计算 算法
基础的点云转换
对于点云处理而言,最简单也逃不过的就是点云转换了,我们就从点云转换开始,来一步步完成点云加速的学习。点云基础转换是3D点云处理中的一个重要步骤。它的主要目的是将点云从一个坐标系转换到另一个坐标系中,通常是为了方便后续处理或者显示。在实际应用中,点云基础转换通常包括平移、旋转、缩放等操作。这里对应了pcl::transformPointCloud这种方法 1. CUDA与Thrust 使用CUDA和Thrust进行点云基础转换可以大大提高处理效率,特别是当点云数据量较大时。CUDA是一种并行计算架构,可以利用GPU的计算能力来加速计算,而Thrust是CUDA的C++模板库,提供了许多与ST
127 0
|
7月前
|
传感器 算法 C++
C++ PCL 设置法向量的方向
C++ PCL 设置法向量的方向
120 0
|
10月前
|
定位技术 C++ 数据格式
C++中GDAL为CreateCopy()创建的栅格图像增添波段数量的方法
C++中GDAL为CreateCopy()创建的栅格图像增添波段数量的方法
|
C++ Python
pcl/pcd/liblas点云强度intensity反射图像过滤显示
pcl/pcd/liblas点云强度intensity反射图像过滤显示
438 0
pcl/pcd/liblas点云强度intensity反射图像过滤显示
|
C++ 数据格式
C++ GDAL修改CreateCopy()创建栅格图像的波段数量
本文介绍基于C++语言GDAL库,为CreateCopy()函数创建的栅格图像添加更多波段的方法~
225 1
C++ GDAL修改CreateCopy()创建栅格图像的波段数量
C++中vector自定义大小方式
C++vector自定义大小 1.vector指定大小(前者必须是定义vector时) vector<int>vc(5);//size为5,值默认为0  cout<<vc.size()<<endl; for(int i=0; i<vc.size(); i++)     cout<<vc[i];  vector<int>vc; vc.resize(5); //size为5,值默认为0 2.指定大小并赋相同初值(前者必须是定义vector时) vector<int>vc(5,9); //size为5,初值为9  cout<<vc.size()<<endl; for(int i=0; i<
313 0
|
算法 数据可视化 定位技术
基于PCL库的通过ICP匹配多幅点云方法
基于PCL库的通过ICP匹配多幅点云方法
基于PCL库的通过ICP匹配多幅点云方法