CGAL: вручную создать набор точек для определения формы - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь использовать алгоритм определения формы CGAL в соответствии с примером "Basic Planar Shape Detection" в CGAL 4.13.1.Однако вместо чтения данных из файла с

CGAL::read_xyz_points(stream,
      std::back_inserter(points),
      CGAL::parameters::point_map(Point_map()).
      normal_map(Normal_map()))

я бы хотел загрузить свои точки из существующего pcl::PointCloud в необходимый тип CGAL.Я просто не уверен, как создать этот тип CGAL.Согласно примеру (выдержка)

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);

Мне просто нужно создать Pwn_vector.Итак, мои вопросы

  1. Могу ли я просто вставить точки в Pwn_vector?
  2. Каков наилучший способ получения нормалей в CGAL?Это CGAL::jet_estimate_normals?
  3. Нужны ли мне карты недвижимости для Point_map и Normal_map?Я не понимаю, как они передаются Efficient_ransac.
  4. Что-нибудь еще нужно?

Я начал со следующего кода:

  // Points with normals.
  cgal::Pwn_vector points;

  // load points from pcl cloud
  for (auto point : cloud.points) {
    cgal::Point_with_normal pwn;
    pwn.first = cgal::ShapeKernel::Point_3(point.x, point.y, point.z);
    points.push_back(pwn);
  }

(PCL не представляет интереса для этого вопроса, поскольку понятно, как получить доступ к отдельным координатам.)

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Чтобы завершить ответ mgimeno (это правильно), вам не обязательно копировать баллы.Интерес карт свойств состоит в том, что вам просто нужно предоставить функцию get(), которая на лету преобразует value_type вашего диапазона в CGAL::Point_3 (CGAL::Vector_3 для нормалей).

Например,для 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 - хороший выбор для этого).Затем, если вы просто создадите шаблоны для своих собственных карт, вы можете напрямую вызвать алгоритм RANSAC в облаке точек PCL.

1 голос
/ 11 июня 2019

Чтобы ответить по пунктам, я бы сказал:

  1. Вам нужно указать баллы и нормали, поэтому я бы сказал нет.

  2. Вы можете использовать [jet] (https://doc.cgal.org/latest/Point_set_processing_3/group__PkgPointSetProcessing3Algorithms.html#ga0cd0f87de690d4edf82740e856efa491), pca или vcm обычную оценку, как хотите.

  3. Они вам не нужны, если вы используете те же типы, что и в примере. Значения по умолчанию подойдут.

  4. В основном вам просто нужно заполнить Pwn_vector вашими точками и результатомВаша нормальная оценка, а остальные должны работать точно так же, как в примере.

...