CGAL:手动创建用于形状检测的点集

时间:2019-06-07 13:55:52

标签: c++ cgal

我正在尝试根据CGAL 4.13.1中的"Basic Planar Shape Detection" example使用CGAL的形状检测算法。但是,与其使用

从文件中读取数据,
firstThree([H1,H2,H3|T]):-
   isSameType(H1,H2),
    areSameType([H2,H3|T]).

我想将现有的CGAL::read_xyz_points(stream, std::back_inserter(points), CGAL::parameters::point_map(Point_map()). normal_map(Normal_map())) 中的点加载到必要的CGAL类型。我只是不确定如何创建此CGAL类型。根据示例(节选)

pcl::PointCloud

我只需要创建typedef std::pair<Kernel::Point_3, Kernel::Vector_3> Point_with_normal; typedef std::vector<Point_with_normal> Pwn_vector; Pwn_vector points; typedef CGAL::Shape_detection_3::Efficient_RANSAC<Traits> Efficient_ransac; EfficientRansac.set_input(points); 。所以我的问题是

  1. 我可以只在Pwn_vector中插入点吗?
  2. 在CGAL中获得法线的最佳方法是什么?是Pwn_vector吗?
  3. 我需要CGAL::jet_estimate_normalsPoint_map的属性映射吗?我看不到如何将它们移交给Normal_map
  4. 还有什么需要的吗?

我从以下代码开始:

Efficient_ransac

(PCL与该问题无关,因为很清楚如何访问单个坐标。)

2 个答案:

答案 0 :(得分:1)

要逐点回答,我会说:

  1. 您需要提供点和法线,所以我不会。

  2. 您可以使用[jet] (https://doc.cgal.org/latest/Point_set_processing_3/group__PkgPointSetProcessing3Algorithms.html#ga0cd0f87de690d4edf82740e856efa491pcavcm正常估算,如您所愿。

  3. 如果使用与示例中相同的类型,则不需要它们。默认值即可。

  4. 基本上,您只需要用您的点数和正常估算的结果填充Pwn_vector,其余的就可以在示例中正常工作。

答案 1 :(得分:1)

要完成mgimeno的答案(这是正确的),您不必复制要点。属性映射的兴趣在于,您只需要提供一个函数get(),即可将范围的value_type即时转换为CGAL::Point_3(对于法线是CGAL::Vector_3)。 / p>

例如,对于PCL,我想您会做类似的事情(我不是PCL的用户,所以这可能不正确,但这只是为了给您一个主意):

struct PCL_point_map
{
   typedef pcl::PointCloud::value_type key_type;
   typedef CGAL::Point_3<Kernel> value_type;
   typedef CGAL::Point_3<Kernel> reference;
   typedef boost::readable_property_map_tag category;

   friend reference get (const PCL_point_map&, const key_type& k)
   {
      return CGAL::Point_3<Kernel> (k.x, k.y, k.z);
   }
};

与法线相似(法线确实需要计算才能使形状检测起作用,CGAL::jet_estimate_normals是一个不错的选择)。然后,如果仅使用自己的地图对特征进行模板化,则可以直接在PCL点云上调用RANSAC算法。