CGAL点云和PCL点云的相互转换

#include <CGAL/Simple_cartesian.h>

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

#include <utility>  // std::tuple
#include <vector>

// CGAL using declarations
using Kernel = CGAL::Simple_cartesian<float>;

using Point = Kernel::Point_3; 
using Vector = Kernel::Vector_3;
using Color = std::array<unsigned char, 3>; 

using PNC = std::tuple<Point, Vector, Color>;

// PCL using declarations
using Cloud = pcl::PointCloud<pcl::PointXYZRGBNormal>;

// 将CGAL points转成PCL point cloud
Cloud cgal2pcl(const std::vector<PNC> & points)
{
  Cloud cloud;

  for (const auto & pnc : points) {
    const Point & p = std::get<0>(pnc);
    const Vector & v = std::get<1>(pnc);
    const Color & c = std::get<2>(pnc);

    pcl::PointXYZRGBNormal pt; 
    pt.x = p.x();
    pt.y = p.y();
    pt.z = p.z();
    pt.normal_x = v.x();
    pt.normal_y = v.y();
    pt.normal_z = v.z();
    pt.r = c[0];
    pt.g = c[1];
    pt.b = c[2];
    cloud.points.push_back(pt);
  }

  return cloud;
}

// 将PCL point cloud转成CGAL points
std::vector<PNC> pcl2cgal(const Cloud & cloud)
{
  std::vector<PNC> points;
  points.reserve(cloud.points.size());

  for (const auto & pt : cloud.points) {
    Point p (pt.x, pt.y, pt.z );
    Vector n (pt.normal_x, pt.normal_y, pt.normal_z);
    Color c { {pt.r, pt.g, pt.b} };

    points.push_back(std::make_tuple(p, n, c));
  }

  return points;
}

根据实际的例子,可能需要将std::tuple<Point, Vector, Color>改成std::pair<Point, Vector>用来存储pcl::PointNormal。另外,如果实际需要的是pcl::PointXYZ,那么只需要使用std::vector<Point>即可。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值