我这里不介绍pcl里面的类的命名规范,及点的类型。为什么呢?pcl里面类的命名规范,比较繁琐,而且主要是针对要对pcl这个库要开源的人士,而pcl里面的点的类型太多,足够满足你的要求。所以我们要走一条具有中国特色的pcl主义道路。
今天来介绍一下pcl里面的3D特征。
点是用来给一个给定区域来用笛卡尔坐标系x,y,z来进行描绘的一种方式。假定坐标系统的坐标原点没有变,可能会有两个点比如p1和p2,成为t1和t2,但是它们的坐标是没变的。
比较这些点云是不稳定的,因为即使他们有相同的距离,但是它们可能采自不同的表面,因此他们可能会代表不同的信息,当把它们和表面上临近的点结合在一起的时候。这是因为很难确保现实世界里面的t1和t2没有变化。有一些获取点云的装置可能会获取一些额外的数据,比如亮度(intensity),比如表面光滑度(翻译不一定对,surface remission value),和颜色等等,但是以上的这些往往还是不能解决问题。
程序往往需要更好的特征或者是矩来区别几何表面。所以把3D点看成笛卡尔坐标系里面的一个单一的实体这个概念消失了,我们引入了一个局部坐标系。文化是丰富多彩,森罗万象的,我们可以对同样的概念取很多的命名组合,比如形状描述,几何特征,而在pcl里面是用点的特征来描述。
通过包含周边的点,采样表面的几何特征可以被我们给推理或者捕获,这将解决我们蛋疼的比较问题。理想情况下,同一个或者相似表面上的点的特征是很相似的。那么怎么来找到一个比较好的,描述点的特征呢?当这个特征在下面这3个因素的影响下,还能或得同样的表面特点的时候就是好的特征。
1.刚体转换。这包括了3D旋转与3D转换,好的特征应该不会被此影响,特征向量F(feature)不会改变。
2.不同的采样密度。总体来说,一个局部的表面区域,不管以高密度还是低密度的采样,应该具有相同的特征向量。
3.噪声。这个不需要过多的解释。
总体来说,pcl里面使用相似的方法来查询指定点的最近邻,如使用kd-trees。下面是我们感兴趣的2个查询时需要的类型;
1.k。即查询时的最近邻的点的个数。
2.r。即搜索半径。
专业术语:
term | explanation |
---|---|
Foo | a class named Foo //英文里面很多随便取的类叫foo或bar类似张三,李四 |
FooPtr | a boost shared pointer to a class Foo,//boost共享指针 e.g., boost::shared_ptr<Foo> |
FooConstPtr | a const boost shared pointer to a classFoo,//boost共享常量指针 e.g., const boost::shared_ptr<const Foo> |
怎么进行输入?
pcl里面基本上所有的类都继承自pcl::PCLBase这个类,所有pcl::Feature有两个方式来获取输入数据。
1.输入为整个点云数据集,setInputCloud(PointCloudConstPtr&) 强制的
这将计算每一个输入点的特征。
2.输入为一个点云数据集的子集。setInputCloud(PointCloudPtr&)和setIndices(IndicesConstPtr&) 后面那个是可选的。
这将计算给定下标的输入点的特征。默认情况下下标是不会给的,也就意味着每个点的特征都会被计算。
除此之外,我们还可以通过别的调用,如setSearchSurface(PointCloudConstPtr &)来搜索表面上的点。