PCL Corespondence Grouping 方法进行3D模板匹配

本文详细介绍了使用Point Cloud Library(PCL)中的对应分组技术进行3D模板匹配的原理与步骤。通过理解点云数据的特征,应用PCL库中的方法,实现精确的三维匹配,为3D场景识别与重建提供关键技术支持。
摘要由CSDN通过智能技术生成
/*
* 此例程使用pcl_recognition 组件讲解 3D目标的识别。特别指出,例程主要讲解Corespondence Grouping算法
* 通过点对点的比对相似性进行点阵的聚类来识别场景中的物体。每一个输出点阵,都是识别的物体的实例,另外
* 算法还输出一个6DOF的转换矩阵来表示目标在场景中的位姿信息
* 
* 
*/


#include <pcl/io/pcd_io.h>
#include <pcl/point_cloud.h>
#include <pcl/correspondence.h>
#include <pcl/features/normal_3d_omp.h>
#include <pcl/features/shot_omp.h>
#include <pcl/features/board.h>
#include <pcl/filters/uniform_sampling.h>
#include <pcl/recognition/cg/hough_3d.h>
#include <pcl/recognition/cg/geometric_consistency.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/kdtree/impl/kdtree_flann.hpp>
#include <pcl/common/transforms.h>
#include <pcl/console/parse.h>

typedef pcl::PointXYZRGBA PointType;
typedef pcl::Normal NormalType;
typedef pcl::ReferenceFrame RFType;
typedef pcl::SHOT352 DescriptorType;

std::string model_filename_;
std::string scene_filename_;

//Algorithm params
bool show_keypoints_      (false);
bool show_correspondences_(false);
bool use_cloud_resolution_(false);
bool  use_hough_          (true);
float model_ss_           (0.01f);
float scene_ss_           (0.03f);
float rf_rad_             (0.015f);
float descr_rad_          (0.02f);
float cg_size_            (0.01f);
float cg_thresh_          (5.0f);

void
showHelp(char* filename)
{
   
    std::cout << std::endl;
    std::cout << "***************************************************************************" << std::endl;
    std::cout << "*                                                                         *" << std::endl;
    std::cout << "*             Correspondence Grouping Tutorial - Usage Guide              *" << std::endl;
    std::cout << "*                                                                         *" << std::endl;
    std::cout << "***************************************************************************" << std::endl << std::endl;
    std::cout << "Usage: " << filename << " model_filename.pcd scene_filename.pcd [Options]" << std::endl << std::endl;
    std::cout << "Options:" << std::endl;
    std::cout << "     -h:                     Show this help." << std::endl;
    std::cout << "     -k:                     Show used keypoints." << std::endl;
    std::cout << "     -c:                     Show used correspondences." << std::endl;
    std::cout << "     -r:                     Compute the model cloud resolution and multiply" << std::endl;
    std::cout << "                             each radius given by that value." << std::endl;
    std::cout << "     --algorithm (Hough|GC): Clustering algorithm used (default Hough)." << std::endl;
    std::cout << "     --model_ss val:         Model uniform sampling radius (default 0.01)" << std::endl;
    std::cout << "     --scene_ss val:         Scene uniform sampling radius (default 0.03)" << std::endl;
    std::cout << "     --rf_rad val:           Reference frame radius (default 0.015)" << std::endl;
    std::cout << "     --descr_rad val:        Descriptor radius (default 0.02)" << std::endl;
    std::cout << "     --cg_size val:          Cluster size (default 0.01)" << std::endl;
    std::cout << "     --cg_thresh val:        Clustering threshold (default 5)" << std::endl << std::endl;
}

void
parseCommandLine(int argc, char* argv[])
{
   
    //Show help
    if (pcl::console::find_switch(argc, argv, "-h"))
    {
   
        showHelp(argv[0]);
        exit(0);
    }

    //Model & scene filenames
    std::vector<int> filenames;
    filenames = pcl::console::parse_file_extension_argument(argc, argv, ".pcd");
    if (filenames.size() != 2)
    {
   
        std::cout << "Filenames missing.\n";
        showHelp(argv[0]);
        exit(-1);
    }

    model_filename_ = argv[filenames[0]];
    scene_filename_ = argv[filenames[1]];

    //Program behavior
    if (pcl::console::find_switch(argc, argv, "-k"))
    {
   
        show_keypoints_ = true;
    }
    if (pcl::console::find_switch(argc, argv, "-c"))
    {
   
        show_correspondences_ = true;
    }
    if (pcl::console::find_switch(argc, argv, 
解决方案指导------匹配(Matching)(1章、2章、3章) 1 第一章 简介 5 1.1 怎样使用该手册? 5 1.2 匹配是什么? 5 1.3 如何进行一般的匹配? 6 1.4 可用的方法有哪些? 6 1.5哪种方法适用于哪种情况? 7 1.5.1 匹配方法:2D与3D的比较 7 1.5.2 3D空间中3D对象和2D对象的决策 8 1.5.3 正交成像2D对象的第一个决策 10 1.5.4 基于形状的匹配VS基于相关性的匹配 11 1.5.5匹配方法的快速指南 12 第二章 总论 14 2.1 准备模板 15 2.1.1 将参考图像简化为模板图像 15 2.1.2 感兴趣区域的影响 16 2.1.2.1参照点 16 2.1.3 合成模型作为模板图像的替代品 18 2.2 模板再使用 23 2.3加快搜索速度 24 2.3.1限制搜索空间 24 2.3.2关于二次抽样 25 2.4 使用匹配结果 28 2.4.1 单个匹配方法的结果 28 2.4.2 关于转换 30 2.4.3 使用估计的二维位置和方向 33 2.4.4使用估计的二维尺度 43 2.4.5使用估计的二维单应矩阵 45 2.4.6使用估计的三维姿态 47 2.4.7关于分数 49 第三章 单个方法 50 3.1 基于灰度的匹配 50 3.2 基于相关性的匹配 51 3.2.1 一个例程 51 3.2.2选择模型ROI 53 3.2.3建立合适的NCC模型 53 3.2.4优化搜索过程 55 3.3 基于形状的匹配 56 3.3.1 一个例子 57 3.3.2选择模型ROI 60 3.3.3创建合适的形状模型 62 3.3.4优化搜索过程 69 3.3.5使用基于形状匹配的具体结果 80 3.3.6适应相机方向的改变 82 3.4基于组件的匹配 83 3.4.1一个例子 84 3.4.2提取初始组件 87 3.4.3创建合适的组件模型 88 3.4.4模型实例的搜索 95 3.4.5使用基于组件的匹配的具体结果 98 3.5局部形变匹配 100 3.5.1一个例子 100 3.5.2选择模型ROI 104 3.5.3建立合适的局部变形模型 104 3.5.4优化搜索过程 107 3.5.5使用局部形变匹配的具体结果 109 3.6透视变形匹配 111 3.6.1一个例子 112 3.6.2选择模型ROI 114 3.6.3创建合适的透视图变形模型 114 3.6.4优化搜索过程 118 3.6.5使用透视图变形匹配的具体结果 120 3.7 基于描述符的匹配 122 3.7.1一个例子 122 3.7.2选择模型ROI 125 3.7.3创建合适的描述符模型 125 3.7.4优化搜索过程 128 3.7.5使用基于描述符匹配的具体结果 130
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值