PCL基础3.2-如何编写新的PCL类
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类的更多相关文章
- 如何编写新的PCL类
博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=244 把代码转换成符合PCL思路和句法的代码,对于第一次接触该基础架构的人会 ...
- 第三章:PCL基础3.1
架构师为了确保在PCL中所有代码风格的一致性,使得其他开发者及用户容易理解源码,PCL开发者制定并遵循着一套严格的编写规范,PCL的开发者都默认此规范. 3.1PCL推荐的命名规范 1.文件命名 1) ...
- 098 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 02 编写并测试Subject类
098 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 02 编写并测试Subject类 本文知识点:编写并测试Subject类 说明: ...
- 099 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 03 编写并测试Student类
099 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 03 编写并测试Student类 本文知识点:编写并测试Subject类 说明: ...
- 一个由印度人编写的VC串口类
http://www.cnblogs.com/lwngreat/p/4098374.html 软件介绍 一个由印度人编写的VC串口类(也是一种VC串口控件),他还配合这个类写了VC 串口通信方面的一些 ...
- C++新特性(类)(转载)
C++新特性(类)里面讲的很清楚,转给大家分享一下 类机制: 类是对某一类对象的抽象:对象是某一类的实例: 类是一种复杂的数据类型,将不同类型的数据和这些数据相关的操作封装在一起的集合体: 通过一道程 ...
- Hibernate的多表查询,分装到一个新的实体类中的一个方法
不知道是否还有其他方法实现,请高人指点. 如果涉及到多张表多字段查询,并且想利用查询出来的字段在界面层构建一个新的实体类,可以使用这种方法: 如果查询出来的多字段中,有多个字段的名字都相同(如想查询出 ...
- C#放缩、截取、合并图片并生成高质量新图的类
原文:C#放缩.截取.合并图片并生成高质量新图的类 using System;using System.Drawing;using System.Drawing.Imaging;using Syste ...
- JDK1.8新特性——Optional类
JDK1.8新特性——Optional类 摘要:本文主要学习了JDK1.8新增加的Optional类. 部分内容来自以下博客: https://www.cnblogs.com/1ning/p/9140 ...
随机推荐
- P1605 迷宫(洛谷)
题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫中移动有上下左右 ...
- Inception-Resnet-V2
零.Inception-Resnet-V2的网络模型 整体结构如下,整体设计简洁直观: 其中的stem部分网络结构如下,inception设计,并且conv也使用了7*1+1*7这种优化形式: inc ...
- Oracle导出导入
导出 exp 用户名/密码 file=文件名.dmp full=y; 导入 imp 用户名/密码 file=文件名.dmp full=y; 使用EXPDP和IMPDP时应该注意的事项: EXP和IMP ...
- Angular5学习笔记 - 集成Bootstrap、Jquery、Tether(三)
一.添加配置 cnpm i bootstrap jquery tether --save 添加后效果 二.配置添加样式和js的引用 打开.angular-cli.json文件,在styles和scri ...
- Js基础之常用对象
今天来总结一下js中的常用对象: 1.string对象 常用方法: charAt():返回在指定位置的字符. charCodeAt():返回在指定的位置的字符的 Unicode 编码. concat( ...
- 使用 acl 库针对 C++ 对象进行序列化及反序列编程
在开发网络应用程序时,各个模块之间的数据通信可谓是家常便饭,为了应对这些数据通信时数据交换的要求,程序员发明了各种数据格式:采用二进制数据结构(早期 C 程序员).采用 XML.采用SOAP(坑人的设 ...
- HTML5离线应用
本地缓存与浏览器缓存 本地缓存是为整个web应用程序服务的而网页缓存值服务与单个网页 本地缓存是为你指定的资源进行缓存,而我们不知道网页缓存会春初哪些内容,他是不安全不可靠的 在没有网络的时候还是可以 ...
- 【转】前端上传组件Plupload使用指南
http://www.cnblogs.com/2050/p/3913184.html Plupload有以下功能和特点: 1.拥有多种上传方式:HTML5.flash.silverlight以及传统的 ...
- adb基本命令总结(Android Debug Bridge)
adb 是PC和设备连接的桥梁,可以通过adb对devices进行相关操作 adb devices 列出你的devices adb kill-server 杀掉ad ...
- Python函数(十)-装饰器(三)
如果多个函数想通过一个装饰器来实现不同的功能的话,可以给装饰器传入参数,让装饰器里的函数对参数进行判断,来实现不同的功能 # -*- coding:utf-8 -*- __author__ = &qu ...