在这次我们将学会隐式形状模型算法通过pcl::ism::ImplicitShapeModel这个类来实现。这个算法是把Hough转换和特征近似包进行结合。有训练集,这个算法将计算一个确定的模型用来预测一个物体的中心。
这个算法由两部分组成,第一部分是训练,第二部分是物体识别。它有以下6步:
1.先发现特征点。这只是一个训练点云的简化。在这个步骤里面所有的点云都将被简化,通过体元栅格这个途径。余下来的点就是特征点。
2.对特征点用FPFH进行预测。
3.通过k-means这个算法进行聚类。
4.计算每一个实例里面的对中心的方向。
5.对每一个视觉信息,数学权重将会被计算。
6.每一个特征点的权重将会被计算。
我们在训练的过程结束以后,接下来就是对象搜索的进程。
1.特征点检测。
2.每个点云特征点的特征检测。
3.对于每个特征搜索最近的视觉信息。
4.对于每一个特征:
对于每一个实例:
对相应的方向进行决策。
5.前面的步骤给了我们一个方向集用来预测中心与能量。
上面的步骤很多涉及机器学习之类的,大致明白那个过程即可
代码部分:
第一步我们需要点云的训练集。在下面是一些可以用的训练集.
用来检测的点云:
下面是代码
#include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/features/normal_3d.h> #include <pcl/features/feature.h> #include <pcl/visualization/cloud_viewer.h> #include <pcl/features/fpfh.h> #include <pcl/features/impl/fpfh.hpp> #include <pcl/recognition/implicit_shape_model.h> #include <pcl/recognition/impl/implicit_shape_model.hpp> int main (int argc, char** argv) { if (argc == 0 || argc % 2 == 0) return (-1); unsigned int number_of_training_clouds = (argc - 3) / 2; pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> normal_estimator; normal_estimator.setRadiusSearch (25.0); std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> training_clouds; std::vector<pcl::PointCloud<pcl::Normal>::Ptr> training_normals; std::vector<unsigned int> training_classes; for (unsigned int i_cloud = 0; i_cloud < number_of_training_clouds - 1; i_cloud++) { pcl::PointCloud<pcl::PointXYZ>::Ptr tr_cloud(new pcl::PointCloud<pcl::PointXYZ> ()); if ( pcl::io: