# define pcl_isfinite(x) std::isfinite(x)
/*
基于对应分组的三维物体识别
基于pcl_recognition模块的三维物体识别。
具体来说,它解释了如何使用对应分组算法,
以便将3D描述符匹配阶段之后获得的一组点到点对应集集合到当前场景中的模型实例中。
每个集群,代表一个可能的场景中的模型实例,
对应的分组算法输出的
变换矩阵识别当前的场景中,
模型的六自由度位姿估计 6DOF pose estimation 。
执行命令
./correspondence_grouping ../milk.pcd ../milk_cartoon_all_small_clorox.pcd -c -k
【1】计算法线向量 近邻邻域内 协方差矩阵PCA 降维到二维平面 计算法线向量
PCA降维原理 http://blog.codinglabs.org/articles/pca-tutorial.html
前面说的是二维降到一维时的情况,假如我们有一堆散乱的三维点云,则可以这样计算法线:
1)对每一个点,取临近点,比如取最临近的50个点,当然会用到K-D树
2)对临近点做PCA降维,把它降到二维平面上,可以想象得到这个平面一定是它的切平面(在切平面上才可以尽可能分散)
3)切平面的法线就是该点的法线了,而这样的法线有两个,取哪个还需要考虑临近点的凸包方向
【2】下采样滤波使用均匀采样(可以试试体素格子下采样)得到关键点
【3】为keypoints关键点计算SHOT描述子
【4】按存储方法KDTree匹配两个点云(描述子向量匹配)点云分组得到匹配的组 描述 点对匹配关系
【5】参考帧霍夫聚类/集合一致性聚类得到 匹配点云cluster 平移矩阵和 匹配点对关系
【6】分组显示 平移矩阵 T 将模型点云按T变换后显示 以及显示 点对之间的连线
*/
#include <pcl/io/pcd_io.h>// 文件、设备读写
#include <pcl/point_cloud.h>//基础pcl点云类型
#include <pcl/correspondence.h>//分组算法 对应表示两个实体之间的匹配(例如,点,描述符等)。
// 特征
#include <pcl/features/normal_3d_omp.h>//法向量特征
#include <pcl/features/shot_omp.h> //描述子 shot描述子 0~1
// https://blog.youkuaiyun.com/bengyanluo1542/article/details/76061928?locationNum=9&fps=1
// (Signature of Histograms of OrienTations)方向直方图特征
#include <pcl/features/board.h>
// 滤波
#include <pcl/filters/uniform_sampling.h>//均匀采样 滤波
// 识别
#include <pcl/recognition/cg/hough_3d.h>//hough算子
#include <pcl/recognition/cg/geometric_consistency.h> //几何一致性
// 可视化
#include <pcl/visualization/pcl_visualizer.h>//可视化
// kdtree
#include <pcl/kdtree/kdtree_flann.h>// kdtree 快速近邻搜索
#include <pcl/kdtree/impl/kdtree_flann.hpp>
// 转换
#include <pcl/common/transforms.h>//点云转换 转换矩阵
// 命令行参数
#include <pcl/console/parse.h>//命令行参数解析
// 别名
/*
shot 特征描述
构造方法:以查询点p为中心构造半径为r 的球形区域,沿径向、方位、俯仰3个方向划分网格,
其中径向2次,方位8次(为简便图中径向只划分了4个),俯仰2次划分网格,
将球形区域划分成32个空间区域。
在每个空间区域计算计算落入该区域点的法线nv和中心点p法线np之间的夹角余弦cosθ=nv·np,
再根据计算的余弦值对落入每一个空间区域的点数进行直方图统计(划分11个),
对计算结果进行归一化,使得对点云密度具有鲁棒性,得到一个352维特征(32*11=352)。
(原论文:Unique Signatures of Histograms for Local Surface)
*/
typedef pcl::PointXYZRGBA PointType;//PointXYZRGBA数据结构 点类型 位置和颜色
typedef pcl::Normal NormalType;//法线类型
typedef pcl::ReferenceFrame RFType;//参考帧
typedef pcl::SHOT352 DescriptorType;//SHOT特征的数据结构(32*11=352)
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);//聚类 霍夫空间设置每个bin的大小
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): Cluster
C++PCL点云库官方基于对应分组的三维物体识别识别例程(VS2019)
免费领取PCD文件
于 2023-11-25 13:50:11 首次发布
博客内容表明可提供PCD文件,若有需求可私聊博主领取。

最低0.47元/天 解锁文章
1408

被折叠的 条评论
为什么被折叠?



