1、文件名为mainBilateralFilter.cpp的文件内容如下

#include <pcl/point_types.h>

#include <pcl/io/pcd_io.h>

#include <pcl/kdtree/kdtree_flann.h>

typedef pcl::PointXYZI PointT;

float

G (float x, float sigma)

{

return exp (- (x*x)/(2*sigma*sigma));

}

int

main (int argc, char*argv[])

{

std::string incloudfile = argv[1];

std::string outcloudfile = argv[2];

float sigma_s = atof (argv[3]);

float sigma_r = atof (argv[4]);

// 从pcd文件加载点云数据

pcl::PointCloud<PointT>::Ptr cloud (new pcl::PointCloud<PointT>);

pcl::io::loadPCDFile (incloudfile.c_str (), *cloud);

int pnumber = (int)cloud->size ();

// 未滤波之前输出点云与输入点云相等

pcl::PointCloud<PointT> outcloud =*cloud;

// 建立kdtree

pcl::KdTreeFLANN<PointT>::Ptr tree (new pcl::KdTreeFLANN<PointT>);

tree->setInputCloud (cloud);

// 近邻相关存储

std::vector<int> k_indices;

std::vector<float> k_distances;

// 关键计算循环

for (int point_id =0; point_id < pnumber; ++point_id)

{

float BF =0;

float W =0;

tree->radiusSearch (point_id, 2* sigma_s, k_indices, k_distances);

// 对于每个近邻进行一下计算

for (size_t n_id =0; n_id < k_indices.size (); ++n_id)

{

float id = k_indices.at (n_id);

float dist = sqrt (k_distances.at (n_id));

float intensity_dist = abs (cloud->points[point_id].intensity - cloud->points[id].intensity);

float w_a = G (dist, sigma_s);

float w_b = G (intensity_dist, sigma_r);

float weight = w_a * w_b;

BF += weight * cloud->points[id].intensity;

W += weight;

}

outcloud.points[point_id].intensity = BF / W;

}

// 存储滤波后的结果点云到文件

pcl::io::savePCDFile (outcloudfile.c_str (), outcloud); return (0);

}

在上面的源代码段中包含以下步骤:

1)输入/输出代码块:从磁盘读数据,向磁盘写数据;

2)初始化代码块:用kd树建立一种搜索最近邻的方法;

3)实际算法代码块:对每个点进行双边滤波处理。

我们的目的是把给出的源码程序转换成PCL的类,以便能够在其他地方重复使用。

2、建立文件结构

ubuntu14.04下PCL目录位置:/usr/include/pcl-1.7/pcl

有两种方法来建立文件结构:

a、分别编写代码,作为独立的PCL类在PCL代码树之外;

b、直接把文件建立在PCL代码目录树中,

下面采用b的方式来建立文件结构,假设我们想要新的算法成为PCL滤波库的一部分,我们开始先在代码树目录filters下新建3个不同的文件:

1)include/pcl/filters/bilateral.h----包含所有的定义和声明。

2)include/pcl/filters/impl/bilateral.hpp----包含模板类的具体实现;

3)src/bilateral.cpp----包含具体的不同点类型的模板类实例化;

下面需要给新的类命名,把它称作BilateralFilter,PCL滤波器接口规定每个算法必须有两个声明和实现可供使用:一个操作PointCloud<T>,一个操作PoingCloud2,下面讲解前者。

1、bilateral.h

该头文件包含所有和BilateralFilter类相关的声明,下面是最小的框架

2、bilateral.hpp

在该文件中有如下内容

还没有给BilateralFilter声明任何方法,因此它没有任何具体实现。

3、bilateral.cpp

4、CMakeLists.txt

把所有新建的文件增加到PCL滤波器的CMakeLists.txt(在\PCL源码根目录\filters\下)文件中,就可以开始编译链接过程,对于CMakeLists.txt的更改就完成了,剩下就是下面对类相关文件内容的填充了。

理解错误!!!要在源码目录下去修改文件,pcl-trunk源码目录

PCL基础3.2-如何编写新的PCL类的更多相关文章

  1. 如何编写新的PCL类

    博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=244 把代码转换成符合PCL思路和句法的代码,对于第一次接触该基础架构的人会 ...

  2. 第三章:PCL基础3.1

    架构师为了确保在PCL中所有代码风格的一致性,使得其他开发者及用户容易理解源码,PCL开发者制定并遵循着一套严格的编写规范,PCL的开发者都默认此规范. 3.1PCL推荐的命名规范 1.文件命名 1) ...

  3. 098 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 02 编写并测试Subject类

    098 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 02 编写并测试Subject类 本文知识点:编写并测试Subject类 说明: ...

  4. 099 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 03 编写并测试Student类

    099 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 03 编写并测试Student类 本文知识点:编写并测试Subject类 说明: ...

  5. 一个由印度人编写的VC串口类

    http://www.cnblogs.com/lwngreat/p/4098374.html 软件介绍 一个由印度人编写的VC串口类(也是一种VC串口控件),他还配合这个类写了VC 串口通信方面的一些 ...

  6. C++新特性(类)(转载)

    C++新特性(类)里面讲的很清楚,转给大家分享一下 类机制: 类是对某一类对象的抽象:对象是某一类的实例: 类是一种复杂的数据类型,将不同类型的数据和这些数据相关的操作封装在一起的集合体: 通过一道程 ...

  7. Hibernate的多表查询,分装到一个新的实体类中的一个方法

    不知道是否还有其他方法实现,请高人指点. 如果涉及到多张表多字段查询,并且想利用查询出来的字段在界面层构建一个新的实体类,可以使用这种方法: 如果查询出来的多字段中,有多个字段的名字都相同(如想查询出 ...

  8. C#放缩、截取、合并图片并生成高质量新图的类

    原文:C#放缩.截取.合并图片并生成高质量新图的类 using System;using System.Drawing;using System.Drawing.Imaging;using Syste ...

  9. JDK1.8新特性——Optional类

    JDK1.8新特性——Optional类 摘要:本文主要学习了JDK1.8新增加的Optional类. 部分内容来自以下博客: https://www.cnblogs.com/1ning/p/9140 ...

随机推荐

  1. Codeforces Round #271 (Div. 2)D(递推,前缀和)

    很简单的递推题.d[n]=d[n-1]+d[n-k] 注意每次输入a和b时,如果每次都累加,就做了很多重复性工作,会超时. 所以用预处理前缀和来解决重复累加问题. 最后一个细节坑了我多次: print ...

  2. 非root用户 如何将cscope安装到指定目录,vim74安装

    随着Linux的普及,使用Linux进行软件开发的人也越来越多.而大多数公司都采用这种方式:提供一台高性能的中央服务器做为开发编译服务器,每个人登录这台服务器进行开发编译.在这种情况下,用户通常没有r ...

  3. DECLARE_MESSAGE_MAP用法

    DECLARE_MESSAGE_MAP( ) 说明:  你的程序中的每一个CCmdTarget的派生类都可以提供一个消息映射以处理消息.在你的类声明的末尾使用DECLARE_MESSAGE_MAP宏. ...

  4. boost开发指南

    C++确实很复杂,神一样的0x不知道能否使C++变得纯粹和干爽? boost很复杂,感觉某些地方有过度设计和太过于就事论事的嫌疑,对实际开发工作的考虑太过于理想化.学习boost本身就是一个复杂度,有 ...

  5. Chrome MarkDown Preview Plus

    /************************************************************************** * Chrome MarkDown Previe ...

  6. 使用zip()并行迭代

  7. UVA - 11107 Life Forms (广义后缀自动机)

    题意:给你n个字符串,求出在超过一半的字符串中出现的所有子串中最长的子串,按字典序输出. 对这n个字符串建广义后缀自动机,建完后每个字符串在自动机上跑一遍,沿fail树向上更新所有子串结点的出现次数( ...

  8. HihoCoder1139 二分·二分答案

    描述 在上一回和上上回里我们知道Nettle在玩<艦これ>,Nettle在整理好舰队之后终于准备出海捞船和敌军交战了.在这个游戏里面,海域是N个战略点(编号1..N)组成,如下图所示其中红 ...

  9. java实现sendemail

    <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</arti ...

  10. .Net学习资源整理

    .Net学习资源整理 ASP.NET Core