来自http://pointclouds.org/documentation/tutorials/correspondence_grouping.php#correspondence-grouping
本教程旨在解释如何基于pcl_recognition模块执行3D对象识别。 具体来说,它解释了如何使用对应分组算法,以便将在3D描述符匹配阶段之后获得的点对点对应集合聚类到当前场景中存在的模型实例中。 对于表示场景中可能的模型实例的每个聚类,对应分组算法还输出识别当前场景中该模型的6DOF姿态估计的变换矩阵。
在开始之前,您应该从GitHub(milk.pcd和milk_cartoon_all_small_clorox.pcd)下载本教程中使用的PCD数据集,并将文件放在方便的文件夹中。
另外,将以下代码复制并粘贴到编辑器中,并将其另存为correspondence_grouping.cpp(或在此处下载源文件)。
注意点:首先是项目的配置问题,一定要配置好,然后一步一步往下测试。
我遇到的问题有:
1,Failed to find match for field "rgba".
找不到匹配的RGBA,这个错误不影响结果,原因是程序在输入的PCD文件中找不到RGBA数据。
2,第二个问题就是User Error 1001:argument to num_threads clause must be positive.
这个原因是由于设置的线程数必须为正,而程序中可能没有设置,有时候甚至环境变量中设置了,但是依然报错,我们不妨手动设置一下。(来自CSDN的文章)
设置后,就没这个错误了。
3,[pcl::SHOTEstimation::computeFeature] The local reference frame is not valid! Aborting description of point with index 3045
这个错误是由于正常半径较小的事实,一些法线是NaN(在设置半径的球体内它们的邻域中没有点)。这曾经导致SHOT出现问题。
只需要把代码中的,
搜索半径改大点。
在这处代码中,同样需要设置线程数,否则会出现报错。
4,哭了,可视化部分一直出现堆栈错误,提醒异常,最后搜了好久百度(实验室服务器到期了,吐血,只能艰难百度),总算是靠在附加依赖项添加了opengl32.lib文件解决了。
原因不知道,谁知道了留言下呗。
给大家看看运行的结果:
这个时候问题又出现了,RT值不变,而且VIsualization界面没有显示点云图……
5,解决下4的问题
EMM,原来是调试的时候我把最后的那句显示点云图的While循环给删了,暴风哭泣。现在成功啦~
用的是GC,没有用Hough3D
6,改用H3D试试。
成功啦!
鼓掌!
现在开始用自己的数据和模板来写了。
代码备份如下:
// ObjectRecongnition.cpp: 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <stdlib.h>
#include <pcl/point_types.h>
#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/kdtree/kdtree_flann.h> //Kdtree库
#include <pcl/kdtree/impl/kdtree_flann.hpp>
#include <pcl/common/transforms.h>
#include <pcl/console/parse.h>
#include <pcl/visualization/cloud_viewer.h>//点云查看窗口头文件
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/visualization/boost.h>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
typedef pcl::PointXYZ PointType; //文中的PintType即为PointXYZRGBA
typedef pcl::Normal NormalType;
typedef pcl::ReferenceFrame RFType;
typedef pcl::SHOT352 DescriptorType;//SHOT特征的数据结构
std::string model_filename_;
std::string scene_filename_;
//Algorithm params
bool show_keypoints_(true);
bool show_correspondences_(true);
bool use_cloud_resolution_(false);
bool use_hough_(true);
float model_ss_(7.5f); //0.01f
float scene_ss_(20.0f);//0.03f-20
float rf_rad_(10.0f); //0.015f-10
float descr_rad_(15.0f);//0.02f -19 -
float