PCL NormalEstimation 源码结构

前言

最近需要借鉴PCL的设计写一个处理点云的程序,主要参考了其中NormalEstimation部分的源码。这里总结一下该部分源码的结构。

当前参考的PCL版本是 1.10.0。

NormalEstimation

NormalEstimation类的继承关系如下

NormalEstimation->Feature->PCLBase

这三个类的定义位于源码根目录下的

  • common/include/pcl/pcl_base.h
  • features/include/pcl/features/features.h
  • features/include/pcl/features/normal_3d.h

PCL设计中每个类的部分implementation放入了一个独立的hpp文件,这些文件的位置为

  • common/include/pcl/impl/pcl_base.hpp
  • features/include/pcl/features/impl/features.hpp
  • features/include/pcl/features/impl/normal_3d.hpp

主要观察NormalEstimation对象如何进行normal的计算。

kdtree和搜索函数

在使用NormalEstimation对象时,需要指定一个kdtree用于搜索最近点,并且最终调用对象的compute()接口计算Normal。kdtree保存在Feature类定义的tree_ 成员变量中(feature.h),是一个pcl::search::Search<>::Ptr类型的对象。Feature类提供了两个重载的protected成员函数searchForNeighbors(),它们都会调用由Feature的成员变量search_method_surface_所指定的搜索方法。成员变量search_method_surface_实际上是一个函数指针(std::function<>, feature.h),最终的实现是在FeatureinitCompute()函数中(feature.hpp)。search_method_surface_根据搜索的类型(按半径或按最近neighbor),被最终赋值为一个lambda函数。这个lambda函数将最终调用tree_radiusSearch()nearestKSearch()方法。

compute()方法

NormalEstimationcompute()方法继承于Feature,调用的入口也是Featurecompute()feature.hpp)。Feature::compute()将会按次序调用initCompute()computeFeature(),和deinitCompute()。其中computeFeature()的实现在NormalEstimation中(normal_3d.hpp)。

NormalEstimation::computeFeature()中,将按indices_成员变量所指定的索引进行循环。indices_成员变量定义在PCLBase类中(pcl_base.h)。赋值点是在PCLBase::initCompute()函数。该函数会由Feature::initCompute()函数显式调用。

对于每个point,当搜索到有效的临近点并计算normal时使用NormalEstimation::computePointNormal()函数并由NormalEstimation::flipNormalTowardsViewpoint()函数指定normal的朝向。NormalEstimation::computePointNormal()需要使用surface_成员变量,该变量定义在Feature类中(feature.h),并在Feature::initCompute()中完成赋值。赋值时surfac_ = input_input_PCLBase的成员变量(pcl_base.h),在调用setInputCloud()时被赋值(pcl_base.hpp)。

computePointNormal()

computePointNormal()NormalEstimation的成员函数也在类外部有定义(normal_3d.h),所用的计算方法大致上与教程上描述的一致。计算过程利用了computeMeanAndCovarianceMatrix()solvePlaneParameters()

NormalEstimation::computeFeature()调用的是其成员函数的computePointNormal()

computeMeanAndCovarianceMatrix()声明在
common/include/pcl/common/centroid.h中,部分实现在
common/include/pcl/common/impl/centroid.hpp中。
该函数有多个重载。

solvePlaneParameters()定义在feature.hpp文件中。该函数有两个重载。

flipNormalTowardsViewPoint()

flipNormalTowardsViewPiont()有多个重载,都定义在NormalEstimation类外部但是在normal_3d.h文件内。

后记

应该画个图的,可是我太懒了在这里插入图片描述

你可能感兴趣的:(学习笔记,c++,点云)