• 填写类的内容


    博客转载自: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

  • 相关阅读:
    【JVM】tomcat参数调整
    windows 资源监视器
    svn搭建相关
    mysqlli
    整理知识
    【刷题】洛谷 P4142 洞穴遇险
    【刷题】洛谷 P4143 采集矿石
    【刷题】BZOJ 4199 [Noi2015]品酒大会
    【刷题】BZOJ 2754 [SCOI2012]喵星球上的点名
    【刷题】BZOJ 3513 [MUTC2013]idiots
  • 原文地址:https://www.cnblogs.com/flyinggod/p/8596392.html
Copyright © 2020-2023  润新知