pcl点云和Eigen::Map转换

点云是一系列点的集合,pcl在存储时放在cloud->points中(vector容器,内存连续),在处理点云时,有时需要将点云数据点格式转换为矩阵格式进行计算,如果直接进行赋值,会重新开辟内存空间,对大数据点云来说并不现实。因此使用Eigen::Map进行内存映射,节省内存空间,加快处理速度。
Eigen::Map是将一段连续的内存空间映射成Eigen中Matrix的形式,可以直接使用相关的矩阵运算,极大的节省了内存占用,提升了计算处理效率。
pcl点云中有函数getMatrixXfMap用于生成Eigen::Map

      inline Eigen::Map<Eigen::MatrixXf, Eigen::Aligned, Eigen::OuterStride<> > 
      getMatrixXfMap (int dim, int stride, int offset)
      {
        if (Eigen::MatrixXf::Flags & Eigen::RowMajorBit)
          return (Eigen::Map<Eigen::MatrixXf, Eigen::Aligned, Eigen::OuterStride<> >(reinterpret_cast<float*>(&points[0])+offset, points.size (), dim, Eigen::OuterStride<> (stride)));
        else
          return (Eigen::Map<Eigen::MatrixXf, Eigen::Aligned, Eigen::OuterStride<> >(reinterpret_cast<float*>(&points[0])+offset, dim, points.size (), Eigen::OuterStride<> (stride)));
      }

其中参数,列优先时,
dim:行数
stride:每列数据的跨度
offset:首地址偏移量

	Eigen::Map<Eigen::Matrix<float,-1,-1>,
		16,Eigen::OuterStride<>> mat = cloud->getMatrixXfMap(4,4,0);

上述代码表示将XYZ转换为size*4的矩阵
pcl转换中无法将矩阵转换为行优先

	Eigen::Map<Eigen::Matrix<float,-1,-1,Eigen::RowMajor>,
		16,Eigen::OuterStride<>> mat = cloud->getMatrixXfMap(4,8,0);

上面的代码会报错。
可以采用以下方式进行行优先的map映射

	Eigen::Map<Eigen::Matrix<float,-1,-1,1>, Eigen::Aligned, Eigen::OuterStride<4> > mat1
		(reinterpret_cast<float*>(&(cloud->points[0])), cloud->points.size(), 3);

以上代码就是直接将数据映射到Eigen::Matrix<float,-1,-1,1>。
根据以上方法可以计算点云的包围盒:

	Eigen::Map<Eigen::Matrix<float,-1,-1>,
		16,Eigen::OuterStride<>> mat_x = cloud->getMatrixXfMap(1,4,0);
	Eigen::Map<Eigen::Matrix<float, -1, -1>,
		16, Eigen::OuterStride< >> mat_y = cloud->getMatrixXfMap(1, 4, 1);
	Eigen::Map<Eigen::Matrix<float, -1, -1>,
		16, Eigen::OuterStride< >> mat_z = cloud->getMatrixXfMap(1, 4, 2);
	std::cout << mat_x.minCoeff(), mat_y.minCoeff(), mat_z.minCoeff();
	std::cout << mat_x.maxCoeff(), mat_y.maxCoeff(), mat_z.maxCoeff();
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值