当前位置:网站首页>pcl点云数据 转化为 Eigen::Map
pcl点云数据 转化为 Eigen::Map
2022-08-04 00:03:00 【Darchan】
pcl点云数据转化为Eigen::Map
需求:了解getMatrixXfMap()函数参数与相关用法,点云程序进行CUDA转写时,可能用到。
1.函数说明:
1.1 优势说明
点云数据点格式转换为矩阵格式进行计算,如果直接进行赋值,会重新开辟内存空间,对大数据点云来说并不现实。
因此使用Eigen::Map进行内存映射,节省内存空间,加快处理速度
。
1.2 函数原型
// pcl/point_cloud.h文件中
inline Eigen::Map<Eigen::MatrixXf, Eigen::Aligned, Eigen::OuterStride<> >
getMatrixXfMap (int dim, int stride, int offset)
注意:
从 pcl1.4.0 开始,Eigen 矩阵被强制为行优先(Row Major) 以提高 PCL 中算法的效率。
原文中:通过正确地 1比1方式 映射 PointCloud 结构到Eigen::Map中,即:点云中的点数 = 矩阵中的行数,点维度 = 矩阵中的列数
。
本文得到结论与原文行列是相反的,点云中的点数 = 矩阵中的列,点维度 = 矩阵中的行数
,如getMatrixXfMap(4,4,0)可以将xyzi点云数据转化为 4*size
的点云矩阵。
1.3 参数说明
- 参数1:
dim
,每一个点需要顾及到的维度 - 参数2:
stride
, 每一个点中所包含的值的数目 - 参数3:
offset
,从每一个点起始位置,跳过的数目
1.4 具体实例
- 新建一个点云,点云的x,y,z,i分别按照索引值进行赋值,方便打印查看。
pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_test(new pcl::PointCloud<pcl::PointXYZI>);
for (int i = 0; i < 10; i++) {
pcl::PointXYZI p;
p.x = i;
p.y = i;
p.z = i;
p.intensity = i;
cloud_test->points.push_back(p);
}
2)使用转换函数提取xyz坐标值
auto pc_matrix = cloud_test->getMatrixXfMap(3,8,0);
说明:为何是(3,8,0)?
因为每一个点取xyz三个维度,故第一个dim取3。第三个偏移值从首位x开始,故第三个参数offset=0。
第二个值为何取8?
开始可能会存在疑问,因为每一个点都是xyzi ,包含4个浮点数,按说应该是4才对,但是查看pcl::PointXYZI结构的组织形式如下,我们发现data[3]并非intensity强度值,而是赋值1.0f。
进一步,查看EIGEN_ALIGN16,发现采用16字节对齐方式,一个浮点数float占据4个字节。即这8个浮点数分别是x,y,z,data[3]=1.0f, data[4]=intensity,data[5] ,data[6] ,data[7]
。(其中data[5] ,data[6] ,data[7]并未赋值)
// PointXYZI结构体
struct PointXYZI : public _PointXYZI
{
inline PointXYZI (const _PointXYZI &p)
{
x = p.x; y = p.y; z = p.z; data[3] = 1.0f;
intensity = p.intensity;
}
}
// EIGEN_ALIGN16 16字节对齐
struct EIGEN_ALIGN16 _PointXYZI
{
PCL_ADD_POINT4D; // This adds the members x,y,z which can also be accessed using the point (which is float[4])
union
{
struct
{
float intensity;
};
float data_c[4];
};
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
- 使用转换函数提取intensity矩阵
auto trans_cloudi = cloud_test->getMatrixXfMap(1,8,4);
4)打印pc_matrix和trans_cloudi值,得到4*10的矩阵
结果图:
同样可以通过属性,查看矩阵维度,如下:
auto col = pc_matrix.row(0).size(); // 10
auto row = pc_matrix.col(0).size(); // 3
auto intensity_col = trans_cloudi.row(0).size(); // 10
边栏推荐
猜你喜欢
全面讲解 Handler机制原理解析 (小白必看)
状态机实验
栈的压入、弹出序列
智能座舱的「交互设计」大战
The Chinese Valentine's Day event is romantically launched, don't let the Internet slow down and miss the dark time
Install third-party packages via whl
- the skip/skipif Pytest learning
响应式织梦模板餐饮酒店类网站
浅谈我国产业园区未来的发展方向
The super perfect layout has shortcut keys and background replacement
随机推荐
LYVE1抗体丨Relia Tech LYVE1抗体解决方案
Creo 9.0二维草图的诊断:加亮开放端点
After building the pytorch environment, the pip and conda commands cannot be used
V8中的快慢数组(附源码、图文更易理解)
并查集详解
学习笔记 | uiautomation(如何)实现自动化
Unity intercepts 3D images and the implementation of picture-in-picture PIP
【深度学习】基于tensorflow的服装图像分类训练(数据集:Fashion-MNIST)
The longest substring that cannot have repeating characters in a leetcode/substring
Apple told Qualcomm: I bought a new campus for $445 million and may plan to speed up self-development of baseband chips
Sqlnet. Ora file with the connection of authentication test
win10+cuda11.7+pytorch1.12.0安装
浅谈我国产业园区未来的发展方向
免费的公共WiFi不要乱连,遭中间人攻击了吧?
孙宇晨:Web3.0和元宇宙将协助人类更加全面地进入网络世界
代码重构:面向单元测试
关于mnn模型输出的数据杂乱无章问题
Justin Sun was invited to attend the 36氪 Yuan Universe Summit and delivered a keynote speech
BPF 可移植性和 CO-RE(一次编译,到处运行)
七夕活动浪漫上线,别让网络拖慢和小姐姐的开黑时间