前言
PCL提供的SpinImageEstimation函数,可以提取三维点云的自旋图像(Spin image, SI)特征。虽然官方推荐使用pcl::Histogram<153>数据类型来存储SI特征,但在实际应用时发现部分函数(如KdTreeFLANN)尚不支持Histogram类型存储的特征(可能不会报错,但是实际效果特别差)。除了将SI特征转存到VFHSignature308等其他数据结构之外,还可通过本文的方法自定义SI数据类型。
一、声明和定义
在point_types.h文件中,添加以下声明:
struct SpinImage153;
同时添加注册代码:
POINT_CLOUD_REGISTER_POINT_STRUCT(pcl::SpinImage153,
(float[153], histogram, si)
)
在point_types.hpp文件中,找到#define PCL_POINT_TYPES和#define PCL_FEATURE_POINT_TYPES,分别在其下方列表中添加:
(pcl::SpinImage153) \
同时添加以下定义:
PCL_EXPORTS std::ostream& operator << (std::ostream& os, const SpinImage153& p);
struct SpinImage153
{
float histogram[153];
static int descriptorSize() { return 153; }
friend std::ostream& operator << (std::ostream& os, const SpinImage153& p);
};
二、模板和测试
在point_representation.h文件中,添加以下代码:
template <>
class DefaultPointRepresentation <SpinImage153> : public DefaultFeatureRepresentation <SpinImage153>
{};
在point_test.h文件中,添加以下代码:
template<> inline bool isFinite<pcl::SpinImage153>(const pcl::SpinImage153&) { return (true); }
至此完成,按照以下形式使用该数据类型即可:
pcl::PointCloud<pcl::SpinImage153>::Ptr si(new pcl::PointCloud<pcl::SpinImage153>)