CGAL:手动创建用于形状检测的点集
CGAL: Manually Create Point Set for Shape Detection
我正在尝试根据 CGAL 4.13.1 中的 "Basic Planar Shape Detection" example 使用 CGAL 的形状检测算法。但是,不是使用
从文件中读入数据
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
。所以我的问题是
- 我可以只在
Pwn_vector
中插入点吗?
- 在 CGAL 中获取法线的最佳方法是什么?是
CGAL::jet_estimate_normals
吗?
- 我需要
Point_map
和 Normal_map
的 属性 地图吗?我不明白他们是如何移交给 Efficient_ransac
.
- 还有什么需要的吗?
我从以下代码开始:
// 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 对这个问题不感兴趣,因为很清楚如何访问单个坐标。)
要逐条回答,我会说:
你需要提供点和法线,所以我拒绝了。
你可以使用[jet]
(https://doc.cgal.org/latest/Point_set_processing_3/group__PkgPointSetProcessing3Algorithms.html#ga0cd0f87de690d4edf82740e856efa491), pca or vcm正常估计,如你所愿。
如果您使用与示例中相同的类型,则不需要它们。默认值即可。
基本上你只需要在Pwn_vector中填写你的分数和你正常估计的结果,其余的应该和例子中的一样。
要完成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
是一个不错的选择)。然后,如果你只是用自己的地图模板化特征,你可以直接在PCL点云上调用RANSAC算法。
我正在尝试根据 CGAL 4.13.1 中的 "Basic Planar Shape Detection" example 使用 CGAL 的形状检测算法。但是,不是使用
从文件中读入数据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
。所以我的问题是
- 我可以只在
Pwn_vector
中插入点吗? - 在 CGAL 中获取法线的最佳方法是什么?是
CGAL::jet_estimate_normals
吗? - 我需要
Point_map
和Normal_map
的 属性 地图吗?我不明白他们是如何移交给Efficient_ransac
. - 还有什么需要的吗?
我从以下代码开始:
// 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 对这个问题不感兴趣,因为很清楚如何访问单个坐标。)
要逐条回答,我会说:
你需要提供点和法线,所以我拒绝了。
你可以使用[jet] (https://doc.cgal.org/latest/Point_set_processing_3/group__PkgPointSetProcessing3Algorithms.html#ga0cd0f87de690d4edf82740e856efa491), pca or vcm正常估计,如你所愿。
如果您使用与示例中相同的类型,则不需要它们。默认值即可。
基本上你只需要在Pwn_vector中填写你的分数和你正常估计的结果,其余的应该和例子中的一样。
要完成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
是一个不错的选择)。然后,如果你只是用自己的地图模板化特征,你可以直接在PCL点云上调用RANSAC算法。