我正在尝试根据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);
。所以我的问题是
Pwn_vector
中插入点吗?Pwn_vector
吗?CGAL::jet_estimate_normals
和Point_map
的属性映射吗?我看不到如何将它们移交给Normal_map
。我从以下代码开始:
Efficient_ransac
(PCL与该问题无关,因为很清楚如何访问单个坐标。)
答案 0 :(得分:1)
要逐点回答,我会说:
您需要提供点和法线,所以我不会。
您可以使用[jet] (https://doc.cgal.org/latest/Point_set_processing_3/group__PkgPointSetProcessing3Algorithms.html#ga0cd0f87de690d4edf82740e856efa491,pca或vcm正常估算,如您所愿。
如果使用与示例中相同的类型,则不需要它们。默认值即可。
基本上,您只需要用您的点数和正常估算的结果填充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算法。