PCL——连接两个点云的字段
连接两个点云的字段
- 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——连接两个点云的字段相关推荐
- 连接两个点云的字段或数据形成新点云
学习如何连接两个不同点云为一个点云,进行操作前要确保两个数据集中字段的类型相同和维度相等,同时了解如何连接两个不同点云的字段(例如颜色 法线)这种操作的强制约束条件是两个数据集中点的数目必须一样,例如 ...
- 连接两个点云中的字段或数据形成新点云以及Opennni Grabber初识
(1)学习如何连接两个不同点云为一个点云,进行操作前要确保两个数据集中字段的类型相同和维度相等,同时了解如何连接两个不同点云的字段(例如颜色 法线)这种操作的强制约束条件是两个数据集中点的数目必须一样 ...
- ch04——4.3.4连接两个点云中的字段或数据形成新点云
ch04--4.3.4连接两个点云中的字段或数据形成新点云 进行连接前要保证两个数据中的字段类型和维度相同,数目一样.如:点云a是n个点的xyz点,点云b是n个点的rgb点,则形成c点云是n个点xyz ...
- R语言使用dplyr包的full_join函数基于多个字段(数据列)全连接两个dataframe、按照多列对数据进行全连接
R语言使用dplyr包的full_join函数基于多个字段(数据列)全连接两个dataframe.按照多列对数据进行全连接 目录
- PCL学习笔记——合并点云
合并点云分为两种类型:第一种是两个点云数据集的字段类型和维度相同,合并之后点云只是点的数量增加了:第二种是两个点云数据集的字段类型或维度不同,但是点的数量相同,合并之后相当于扩展了字段或维度,例如点云 ...
- PCL学习一:点云与PCL基础
参考引用 黑马机器人 | PCL-3D点云 PCL(Point Cloud Library)学习记录 PCL点云库学习笔记(文章链接汇总) 1. 点云概述 点云(Point Cloud)是三维空间中, ...
- 两种点云地面去除方法
目录 1.基于角度分割的地面.非地面分割 1.1 PCL基本入门 1.1.1 在ROS项目中引入PCL库 1.2 编写节点进行Voxel Grid Filter 1.2.1 验证效果 1.3 点云地面 ...
- PCL函数库摘要——点云分割
1.Class pcl::gpu::EuclideanClusterExtraction 类EuclideanClusterExtraction是基于欧氏距离进行聚类分割的类,此类基于GPU实现并依赖 ...
- 【分享】乐才无需代码连接钉钉氚云的方法
乐才用户使用场景: 企业使用乐才人事智能管理系统管理组织架构.员工档案.招聘流程.员工福利等各个方面,提高人才管理效率.每当有员工入职时,HR需要先在乐才平台创建员工档案,发送电子合同签署,安排培训等 ...
最新文章
- Netty之粘包问题解决
- C++知识点4——vector与string简述
- mysql 实时聚合分析_mysql滑动聚合/年初至今聚合原理与用法实例分析
- Mysql:日志管理:二进制事务日志
- 停用chrome的开发者提醒
- 超标量体系结构_计算机体系结构——以多发射和静态调度来开发ILP
- oracle 自动化运维--自动搭建oracle dataguard 运维工具(开发源代码)
- Windows Mobile DIY ROM 常用工具
- 我要偷偷的学Python,然后惊呆所有人(第四天)
- 列联表分析基于R语言
- 济南推动大数据产业发展 居民生活将有新变化
- 最贵新股没破发,此前弃购7.8个亿,背靠华为的这家半导体公司这么香?
- Msql特定业务之自增业务表,适用于根据表去分类管理业务数据
- 量化开发必掌握的30个知识点【什么是分笔逐笔数据】?
- 计算机考博面试题,交大系统博士笔试和面试题目
- 开启共享文件夹/共享打印机功能
- 【操作系统】线程栈如何分配
- Apache/.htaccess的Order Allow,Deny 详解
- 2023上海海洋大学计算机考研信息汇总
- 二分查找的递归与非递归实现
热门文章
- 利用Microsoft.VisualBasic dll来修改系统时间
- Prometheus 监控服务端口、网站状态等(黑盒监测)
- 在 Ubuntu 中更换字体
- grafana+zabbix 部署分布式监控系统
- Linux服务器启动流程详解
- 使用doc下的copy命令复制文件时,注意文件分割符
- java中,数值计算时的类型转换 ( 两个int类型相加,赋值给double )
- 【Linux】/etc/shadow文件字段解释
- [Android Pro] java.lang.IllegalStateException: Fragment(XXFragment) not attached to Activity异常
- MacOS~jenkins里解决docker执行权限问题