欢迎点云相关产学研的学者和团体加入我们。
接着我们定义一个处理输入点云的方法,首先计算点云的曲面法线然后估计曲面的特征描述子。
// 计算点云对应的法线与特征描述子
void
processInput ()
{
computeSurfaceNormals ();
computeLocalFeatures ();
}
我们用PCL的NormalEstimation类来计算曲面法线,首先,我们必须指定输入点云,在寻找近邻点的时候将用到的kdtree进行高效搜索,在此需要用到在重构函数中设定的近邻点的搜索半径,然后我们计算曲面法线并且存储这个变量作为对象的数据。
// 计算点云的法线数据
void
computeSurfaceNormals ()
{
normals_ =SurfaceNormals::Ptr (new SurfaceNormals);
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal>norm_est;
norm_est.setInputCloud (xyz_);
norm_est.setSearchMethod (search_method_xyz_);
norm_est.setRadiusSearch (normal_radius_);
norm_est.compute (*normals_);
}
相似的,我们可以用PCL的FPFHEstimation类通过输入的点云和它的曲面法线来计算FPFH描述子。
//计算FPFH特征描述子
void
computeLocalFeatures ()
{
features_ =LocalFeatures::Ptr (new LocalFeatures);
pcl::FPFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::FPFHSignature33>fpfh_est;
fpfh_est.setInputCloud (xyz_);
fpfh_est.setInputNormals (normals_);
fpfh_est.setSearchMethod (search_method_xyz_);
fpfh_est.setRadiusSearch (feature_radius_);
fpfh_est.compute (*features_);
}
上述的类封装了计算特征描述子和储存特征描述子以及相对应的点云数据需要的工作。
现在我们将解析TemplateAlignment类,顾名思义,这个类被用于执行模板对齐(也可以是模板拟合/匹配/配准),一个模板定义为大场景下一个典型的小的像素集或点集,通过对齐一个模板到一个新的影像或点云,可以决定模板所代表的目标对像的位置和方向。
我们首先从定义一个用来存储配准结果的结构体开始,它包含有三个成员,第一个为一个浮点数变量,该变量代表配准效果(值越低表示配准的越准确),第二个是一个变换矩阵,该变换矩阵是描述模板点集应该如何旋转和平移以至于更好的跟目标点云中的点集进行配准,第三个成员为一个宏,因为我们在这个结构体中使用到一个 Eigen::Matrix4f 结构,所以需要添加 EIGEN_MAKE_ALIGNED_OPERATOR_NEW 宏,这将重载 Eigen::Matrix4f 结构的 new 运算符,使其产生十六字节对齐的指针。
// 保存配准结果的结构体
struct Result
{
float fitness_score;
Eigen::Matrix4f final_transformation;
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
这个构造函数中,我们初始化SampleConsensusInitialAlignment(SAC-IA)这个对象,该对象用来执行配准计算,给它的每个参数赋值(注:对应点的距离阈值事实上被指定为是距离的平方,在本例中,我们决定将距离阈值设定为0.01m,所以如下)
TemplateAlignment () :
min_sample_distance_ (0.05f),
max_correspondence_distance_ (0.01f*0.01f),
nr_iterations_ (500)
{
// 初始化ASC-IA的相关参数
sac_ia_.setMinSampleDistance (min_sample_distance_);
sac_ia_.setMaxCorrespondenceDistance(max_correspondence_distance_);
sac_ia_.setMaximumIterations (nr_iterations_);
}
未完待续,敬请关注“对齐对象模板到点云(3)”的其他内容。