连接两个点云的字段

  • 1. 示例代码
  • 2. 上面出现的PointT类型
    • 2.1 PointXYZ
    • 2.2 Normal
    • 2.3 PointNormal

1. 示例代码

以下代码参照PCL官方文档:https://pcl.readthedocs.io/projects/tutorials/en/master/concatenate_fields.html

  • concatenate_fields.cpp
#include <iostream>
#include <pcl/common/io.h> // for concatenateFields
#include <pcl/point_types.h>//这里的约束条件是,两个数据集中的点数必须相等。
int main()
{pcl::PointCloud<pcl::PointXYZ> cloud_a;pcl::PointCloud<pcl::Normal> cloud_b;pcl::PointCloud<pcl::PointNormal> cloud_c;// Fill in the cloud datacloud_a.width = cloud_b.width = 5;cloud_a.height = cloud_b.height = 1;cloud_a.resize(cloud_a.width * cloud_a.height);cloud_b.resize(cloud_b.width * cloud_b.height);for (std::size_t i = 0; i < cloud_a.size(); ++i){cloud_a[i].x = 1024 * rand() / (RAND_MAX + 1.0f);cloud_a[i].y = 1024 * rand() / (RAND_MAX + 1.0f);cloud_a[i].z = 1024 * rand() / (RAND_MAX + 1.0f);}for (std::size_t i = 0; i < cloud_b.size(); ++i){cloud_b[i].normal[0] = 1024 * rand() / (RAND_MAX + 1.0f);cloud_b[i].normal[1] = 1024 * rand() / (RAND_MAX + 1.0f);cloud_b[i].normal[2] = 1024 * rand() / (RAND_MAX + 1.0f);}std::cerr << "Cloud A: " << std::endl;for (std::size_t i = 0; i < cloud_a.size(); ++i)std::cerr << "    " << cloud_a[i].x << " " << cloud_a[i].y << " " << cloud_a[i].z << std::endl;std::cerr << "Cloud B: " << std::endl;for (std::size_t i = 0; i < cloud_b.size(); ++i)std::cerr << "    " << cloud_b[i].normal[0] << " " << cloud_b[i].normal[1] << " " << cloud_b[i].normal[2] << std::endl;//create cloud_c by concatenating the fields of cloud_a and cloud_b together.pcl::concatenateFields(cloud_a, cloud_b, cloud_c);std::cerr << "Cloud C: " << std::endl;for (std::size_t i = 0; i < cloud_c.size(); ++i)std::cerr << "    " <<cloud_c[i].x << " " << cloud_c[i].y << " " << cloud_c[i].z << " " <<cloud_c[i].normal[0] << " " << cloud_c[i].normal[1] << " " << cloud_c[i].normal[2] << std::endl;system("Pause");return (0);
}

2. 上面出现的PointT类型

2.1 PointXYZ

  • PointXYZ只包含三维xyz坐标信息,附加一个浮点数是为了满足存储对齐,所以一共有4个浮点数。
  struct EIGEN_ALIGN16 PointXYZ : public _PointXYZ{inline PointXYZ (const _PointXYZ &p){x = p.x; y = p.y; z = p.z; data[3] = 1.0f;}inline PointXYZ (){x = y = z = 0.0f;data[3] = 1.0f;}inline PointXYZ (float _x, float _y, float _z){x = _x; y = _y; z = _z;data[3] = 1.0f;}friend std::ostream& operator << (std::ostream& os, const PointXYZ& p);EIGEN_MAKE_ALIGNED_OPERATOR_NEW};

2.2 Normal

  • Normal结构体表示给定点所在样本曲面的法线方向,以及对应曲率的测量值。
  • 第四个元素用来占位,这样可以兼容SSE和高效计算。
  • 曲率不能和xyz一样被存储在同一个数组中,它需要独立的变量以避免被普通的数据操作覆盖。
  struct Normal : public _Normal{inline Normal (const _Normal &p){normal_x = p.normal_x; normal_y = p.normal_y; normal_z = p.normal_z;data_n[3] = 0.0f;curvature = p.curvature;}inline Normal (){normal_x = normal_y = normal_z = data_n[3] = 0.0f;curvature = 0;}inline Normal (float n_x, float n_y, float n_z){normal_x = n_x; normal_y = n_y; normal_z = n_z;curvature = 0;data_n[3] = 0.0f;}friend std::ostream& operator << (std::ostream& os, const Normal& p);EIGEN_MAKE_ALIGNED_OPERATOR_NEW};

2.3 PointNormal

  • PointNormal是存储XYZ数据的point结构体,并且包括采样点对应法线和曲率
  struct PointNormal : public _PointNormal{inline PointNormal (const _PointNormal &p){x = p.x; y = p.y; z = p.z; data[3] = 1.0f;normal_x = p.normal_x; normal_y = p.normal_y; normal_z = p.normal_z; data_n[3] = 0.0f;curvature = p.curvature;}inline PointNormal (){x = y = z = 0.0f;data[3] = 1.0f;normal_x = normal_y = normal_z = data_n[3] = 0.0f;}friend std::ostream& operator << (std::ostream& os, const PointNormal& p);};

PCL——连接两个点云的字段相关推荐

  1. 连接两个点云的字段或数据形成新点云

    学习如何连接两个不同点云为一个点云,进行操作前要确保两个数据集中字段的类型相同和维度相等,同时了解如何连接两个不同点云的字段(例如颜色 法线)这种操作的强制约束条件是两个数据集中点的数目必须一样,例如 ...

  2. 连接两个点云中的字段或数据形成新点云以及Opennni Grabber初识

    (1)学习如何连接两个不同点云为一个点云,进行操作前要确保两个数据集中字段的类型相同和维度相等,同时了解如何连接两个不同点云的字段(例如颜色 法线)这种操作的强制约束条件是两个数据集中点的数目必须一样 ...

  3. ch04——4.3.4连接两个点云中的字段或数据形成新点云

    ch04--4.3.4连接两个点云中的字段或数据形成新点云 进行连接前要保证两个数据中的字段类型和维度相同,数目一样.如:点云a是n个点的xyz点,点云b是n个点的rgb点,则形成c点云是n个点xyz ...

  4. R语言使用dplyr包的full_join函数基于多个字段(数据列)全连接两个dataframe、按照多列对数据进行全连接

    R语言使用dplyr包的full_join函数基于多个字段(数据列)全连接两个dataframe.按照多列对数据进行全连接 目录

  5. PCL学习笔记——合并点云

    合并点云分为两种类型:第一种是两个点云数据集的字段类型和维度相同,合并之后点云只是点的数量增加了:第二种是两个点云数据集的字段类型或维度不同,但是点的数量相同,合并之后相当于扩展了字段或维度,例如点云 ...

  6. PCL学习一:点云与PCL基础

    参考引用 黑马机器人 | PCL-3D点云 PCL(Point Cloud Library)学习记录 PCL点云库学习笔记(文章链接汇总) 1. 点云概述 点云(Point Cloud)是三维空间中, ...

  7. 两种点云地面去除方法

    目录 1.基于角度分割的地面.非地面分割 1.1 PCL基本入门 1.1.1 在ROS项目中引入PCL库 1.2 编写节点进行Voxel Grid Filter 1.2.1 验证效果 1.3 点云地面 ...

  8. PCL函数库摘要——点云分割

    1.Class pcl::gpu::EuclideanClusterExtraction 类EuclideanClusterExtraction是基于欧氏距离进行聚类分割的类,此类基于GPU实现并依赖 ...

  9. 【分享】乐才无需代码连接钉钉氚云的方法

    乐才用户使用场景: 企业使用乐才人事智能管理系统管理组织架构.员工档案.招聘流程.员工福利等各个方面,提高人才管理效率.每当有员工入职时,HR需要先在乐才平台创建员工档案,发送电子合同签署,安排培训等 ...

最新文章

  1. Netty之粘包问题解决
  2. C++知识点4——vector与string简述
  3. mysql 实时聚合分析_mysql滑动聚合/年初至今聚合原理与用法实例分析
  4. Mysql:日志管理:二进制事务日志
  5. 停用chrome的开发者提醒
  6. 超标量体系结构_计算机体系结构——以多发射和静态调度来开发ILP
  7. oracle 自动化运维--自动搭建oracle dataguard 运维工具(开发源代码)
  8. Windows Mobile DIY ROM 常用工具
  9. 我要偷偷的学Python,然后惊呆所有人(第四天)
  10. 列联表分析基于R语言
  11. 济南推动大数据产业发展 居民生活将有新变化
  12. 最贵新股没破发,此前弃购7.8个亿,背靠华为的这家半导体公司这么香?
  13. Msql特定业务之自增业务表,适用于根据表去分类管理业务数据
  14. 量化开发必掌握的30个知识点【什么是分笔逐笔数据】?
  15. 计算机考博面试题,交大系统博士笔试和面试题目
  16. 开启共享文件夹/共享打印机功能
  17. 【操作系统】线程栈如何分配
  18. Apache/.htaccess的Order Allow,Deny 详解
  19. 2023上海海洋大学计算机考研信息汇总
  20. 二分查找的递归与非递归实现

热门文章

  1. 利用Microsoft.VisualBasic dll来修改系统时间
  2. Prometheus 监控服务端口、网站状态等(黑盒监测)
  3. 在 Ubuntu 中更换字体
  4. grafana+zabbix 部署分布式监控系统
  5. Linux服务器启动流程详解
  6. 使用doc下的copy命令复制文件时,注意文件分割符
  7. java中,数值计算时的类型转换 ( 两个int类型相加,赋值给double )
  8. 【Linux】/etc/shadow文件字段解释
  9. [Android Pro] java.lang.IllegalStateException: Fragment(XXFragment) not attached to Activity异常
  10. MacOS~jenkins里解决docker执行权限问题