填写类的内容

博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=254

如果你正确无误地编辑了以上所有文件,在适当的地方使用新的滤波器类重编译PCL源码应该没有问题。这一小节中,我们开始填充每一个文件中的代码,我们从bilateral.cpp文件开始,因为它的内容是最短的。

bilateral.cpp

如前所述,我们准备为BilateralFilter类实例化并预编译实例化若干模板。尽管这可能增加PCL滤波库的编译时间,但是在用户编写的代码中使用该类的时候,能够使编译模板速度提高。为此最简单的做法像下面的在bilateral.cpp文件中手工添加模板实例化代码,每行对应一个需要手工预编译的模板实例:

#include <pcl/point_types.h>
#include <pcl/filters/bilateral.h>
#include <pcl/filters/impl/bilateral.hpp>
template class PCL_EXPORTS pcl::BilateralFilter<pcl::PointXYZ>;
template class PCL_EXPORTS pcl::BilateralFilter<pcl::PointXYZI>;
template class PCL_EXPORTS pcl::BilateralFilter<pcl::PointXYZRGB>;
// ...

然而,随着PCL支持的点的类型增加,上面一一对应的定义方式会使文件迅速增大,随后在维护PCL更新时变的更麻烦。因此,我们准备使用一个特殊的叫做PCL_INSTANTIATE的宏,并对以上代码做如下改变:

#include <pcl/point_types.h>
#include <pcl/impl/instantiate.hpp>
#include <pcl/filters/bilateral.h>
#include <pcl/filters/impl/bilateral.hpp>
PCL_INSTANTIATE(BilateralFilter,PCL_XYZ_POINT_TYPES);

这个例子,可以对所有在point_types.h文件中定义的XYZ点类型对应的BilateralFilter模板类进行实例化,继而在编译类的时候就省去了PCL用户使用时的编译时间。

仔细看例子中的代码,我们注意到像cloud->points[point_id].intensity这样的引用,这表明我们的滤波器需要在点类型中有强度成员,因此,使用PCL_XYZ_POINT_TYPES就不起作用,因为不是所有声明了的类型都有强度数据。实际上,很容易注意到只有两个类型包含强度成员,也就是PointXYZI和PointXYZINormal,因此替换掉PCL_XYZ_POINT_TYPES,最后bilateral.cpp文件见本章源码文件1.0文件夹下的该文件。

注意:现在还没有为BilateralFilter声明PCL_INSTANTIATE模板类,实际上也没有实现抽象类pcl::Filter中的纯虚函数,因此如果试图编译代码将产生如下错误:

filters/src/bilateral.cpp:6:32: error: expected constructor, destructor, or type conversion before ‘(’ token…

bilateral.h

开始填充BilateralFilter类的内容,首先声明构造函数和它的成员变量。因为该双边滤波器算法有两个参数,我们存储起来作为类的成员,并按照PCL 1.X的API范例来为它们实现各种设值函数(setters)和取值函数(getters),代码如下:

...
namespace pcl
{
template<typenamePointT>
class BilateralFilter:public Filter<PointT>
{
public:
BilateralFilter():sigma_s_(0),sigma_r_(std::numeric_limits<double>::max())
{
}
void
setSigmaS(const double sigma_s)
{
sigma_s_=sigma_s;
}
double
getSigmaS()
{
return(sigma_s_);
}
void
setSigmaR(const double sigma_r)
{
sigma_r_=sigma_r;
}
double
getSigmaR()
{
return(sigma_r_);
}
private:
double sigma_s_;
double sigma_r_;
};
}
 #endif // PCL_FILTERS_BILATERAL_H_

未完待续,敬请关注“填写类的内容(2)的其他内容。

敬请关注PCL(Point Cloud Learning)中国更多的点云库PCL(Point Cloud Library)相关官方教程。

 

参考文献:

1.朱德海、郭浩、苏伟.点云库PCL学习教程(ISBN 978-7-5124-0954-5)北京航空航天出版社2012-10

posted @ 2018-03-18 17:32  采男孩的小蘑菇  阅读(352)  评论(0编辑  收藏  举报