zoukankan      html  css  js  c++  java
  • VFH视点特征直方图

    VFH(Viewpoint Feature Histogram)描述子应用于点云聚类识别和六自由度位姿估计问题

    (1)训练

    给定一个只包含一个物体的场景,这样方便后面聚类的得到。利用一个准确的位姿记录系统获取位姿。获取的不同视角的点云计算VFH描述子。

    保存不同视角的点云,并基于此建立kdtree。
    (2)测试

    从给定的场景中分割提取出聚类。对于每个聚类,计算其VFH描述子。利用VFH描述子在上面建立的kdtree进行搜索查找。

     VFH利用了FPFH特征优异的识别能力,同时引入视点变量以使其不受尺度变化影响,VFH是对整个点云进行处理的(输出结果只有一个直方图)。

    VFH特征包含两部分:

    1.viewpoint direction component

    计算视点方向和所有点的法向的夹角的直方图(视点方向平移到每个点处)

    2.extened FPFH component

    measure between the viewpoint direction at the centroid point and each of the normals on the surface.

     

    // load point cloud
        pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
        pcl::io::loadPCDFile("D:\pcd\rabbit.pcd", *cloud);
        cout << "points size:" << cloud->points.size() << endl;
        clock_t t3 = clock();
        pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
        ne.setInputCloud(cloud);
        pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
        ne.setSearchMethod(tree);
        pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>);
        ne.setKSearch(5);
        //ne.setRadiusSearch(0.03);
        ne.compute(*cloud_normals);
        clock_t t4 = clock();
        double time = (double)(t4 - t3) / CLOCKS_PER_SEC;
        cout << "calc normal time:" << time << endl;
    
    pcl::VFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::VFHSignature308> vfh;
        vfh.setInputCloud(cloud);
        vfh.setInputNormals(cloud_normals);
        vfh.setViewPoint(0, 0, 10000);
        pcl::search::KdTree<pcl::PointXYZ>::Ptr tree1(new pcl::search::KdTree<pcl::PointXYZ>);
        vfh.setSearchMethod(tree1);
        pcl::PointCloud<pcl::VFHSignature308>::Ptr vfhs(new pcl::PointCloud<pcl::VFHSignature308>());
        vfh.compute(*vfhs);
    
    //定义绘图器
        pcl::visualization::PCLPlotter *plotter = new pcl::visualization::PCLPlotter("My Plotter");
        //设置特性
        plotter->setShowLegend(true);
        std::cout << pcl::getFieldsList<pcl::VFHSignature308>(*vfhs);
    
        //显示
        plotter->addFeatureHistogram<pcl::VFHSignature308>(*vfhs, "vfh", 0, "vfh");
        plotter->setWindowSize(800, 600);
        plotter->spinOnce(30000);
    
        plotter->clearPlots();
    View Code
  • 相关阅读:
    Go语言实现:【剑指offer】跳台阶
    Go语言实现:【剑指offer】斐波那契数列
    Go语言实现:【剑指offer】栈的压入、弹出序列
    Go语言实现:【剑指offer】替换空格
    Go语言实现:【剑指offer】表示数值的字符串
    Go语言实现:【剑指offer】第一个只出现一次的字符位置
    Go语言实现:【剑指offer】把字符串转换成整数
    Go语言实现:【剑指offer】翻转单词顺序列
    robot framework使用小结(二)
    robot framework使用小结(一)
  • 原文地址:https://www.cnblogs.com/larry-xia/p/11858765.html
Copyright © 2011-2022 走看看