pcl里面的RoPs特征(Rotational Projection Statistics)

这次我们将使用pcl::ROPSEstimation这个类来导出点的特征。

下面是这个方法的特征提取方式。有一个网格和一个点集可以让我们来执行一些简单的操作。第一步,对于一个给定的兴趣点局部的表面将会被削平。局部表面包含了在半径内的点和三角形。对于给定的局部表面LRF将被计算。LRF是向量的3个组之一。真正重要的是使用那些具有旋转不变的向量。为了做到这一点,我们把感兴趣的点作为原点来做转换,再这之后我们旋转局部表面,以至于LRF向量关于Ox,Oy,Oz坐标轴对称。完成这些后,我们开始了特征导出。对于每个Ox,Oy,Oz坐标轴,我们会把这些这些坐标轴作为当前的坐标轴。

1.局部表面通过一个给定的角度在当前的坐标轴进行旋转。

2.把局部表面投影成3个平面XY,XZ和YZ.

3.对于每个投影分布矩阵,这个矩阵将展示怎么样把把点分到不同的容器里面。容器的数量代表了矩阵的维度和算法的参数。

4.每个分布矩阵的中心矩将会被计算。M11,M12,M21,M22,E。E是信息熵。

5.计算值将会组成子特征。

 

我们把上面这些步骤进行多次迭代。不同坐标轴的子特征将组成RoPS描述器。

下面是代码

我们首先要找到目标模型

points 包含点云

indices 点的下标

triangles包含了多边形

#include <pcl/features/rops_estimation.h>
#include <pcl/io/pcd_io.h>
int main (int argc, char** argv)
{
if (argc != 4)
return (-1);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ> ());
if (pcl::io::loadPCDFile (argv[1], *cloud) == -1)
return (-1);
pcl::PointIndicesPtr indices = boost::shared_ptr <pcl::PointIndices> (new pcl::PointIndices ());
std::ifstream indices_file;
indices_file.open (argv[2], std::ifstream::in);
for (std::string line; std::getline (indices_file, line);)
{
std::istringstream in (line);
unsigned int index = 0;
in >> index;
indices->indices.push_back (index - 1);
}
indices_file.close ();
std::vector <pcl::Vertices> triangles;
std::ifstream triangles_file;
triangles_file.open (argv[3], std::ifstream::in);
for (std::string line; std::getline (triangles_file, line);)
{
pcl::Vertices triangle;
std::istringstream in (line);
unsigned int vertex = 0;
in >> vertex;
triangle.vertices.push_back (vertex - 1);
in >> vertex;
triangle.vertices.push_back (vertex - 1);
in >> vertex;
triangle.vertices.push_back (vertex - 1);
triangles.push_back (triangle);
}
float support_radius = 0.0285f;
unsigned int number_of_partition_bins = 5;
unsigned int number_of_rotations = 3;
pcl::search::KdTree<pcl::PointXYZ>::Ptr search_method (new pcl::search::KdTree<pcl::PointXYZ>);
search_method->setInputCloud (cloud);
pcl::ROPSEstimation <pcl::PointXYZ, pcl::Histogram <135> > feature_estimator;
feature_estimator.setSearchMethod (search_method);
feature_estimator.setSearchSurface (cloud);
feature_estimator.setInputCloud (cloud);
feature_estimator.setIndices (indices);
feature_estimator.setTriangles (triangles);
feature_estimator.setRadiusSearch (support_radius);
feature_estimator.setNumberOfPartitionBins (number_of_partition_bins);
feature_estimator.setNumberOfRotations (number_of_rotations);
feature_estimator.setSupportRadius (support_radius);
pcl::PointCloud<pcl::Histogram <135> >::Ptr histograms (new pcl::PointCloud <pcl::Histogram <135> > ());
feature_estimator.compute (*histograms);
return (0);
}

 

上面是指定下标点的RoPS特征计算的地方

 std::vector <pcl::Vertices> triangles;
std::ifstream triangles_file;
triangles_file.open (argv[3], std::ifstream::in);
for (std::string line; std::getline (triangles_file, line);)
{
pcl::Vertices triangle;
std::istringstream in (line);
unsigned int vertex = 0;
in >> vertex;
triangle.vertices.push_back (vertex - 1);
in >> vertex;
triangle.vertices.push_back (vertex - 1);
in >> vertex;
triangle.vertices.push_back (vertex - 1);
triangles.push_back (triangle);
}

上面是加载关于多边形的信息的。你可以取代信息用下面的代码来进行三角划分,如果你只有点云没有网格图。

 float support_radius = 0.0285f;
unsigned int number_of_partition_bins = 5;
unsigned int number_of_rotations = 3;

上面的这些代码定义了重要的算法参数,局部表面裁剪支持的半径,以及用于组成分布矩阵的容器的数量和旋转的次数。最后的参数将影响描述器的长度。

 pcl::search::KdTree<pcl::PointXYZ>::Ptr search_method (new pcl::search::KdTree<pcl::PointXYZ>);
search_method->setInputCloud (cloud);


上面设置了搜索方法。

  pcl::ROPSEstimation <pcl::PointXYZ, pcl::Histogram <135> > feature_estimator;
feature_estimator.setSearchMethod (search_method);
feature_estimator.setSearchSurface (cloud);
feature_estimator.setInputCloud (cloud);
feature_estimator.setIndices (indices);
feature_estimator.setTriangles (triangles);
feature_estimator.setRadiusSearch (support_radius);
feature_estimator.setNumberOfPartitionBins (number_of_partition_bins);
feature_estimator.setNumberOfRotations (number_of_rotations);
feature_estimator.setSupportRadius (support_radius);

上面是实例化类的地方。它包含了两个参数

PointInT:输入点的类型

PointOutT:输出点的类型

最终我们需要进行特征计算

  pcl::PointCloud<pcl::Histogram <135> >::Ptr histograms (new pcl::PointCloud <pcl::Histogram <135> > ());
feature_estimator.compute (*histograms);

然后运行

./rops_feature points.pcd indices.txt triangles.txt

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac os修改计算机名,如何修改Mac系统的个人用户名?

在Mac OS X中一旦建立一个用户&#xff0c;此用户的主目录的目录名将会是它的“短”名。更改登录名和主目录名从来都不简单&#xff0c;以前唯一的方法就是建立一个新用户&#xff0c;然后把所有的文件拷贝过去。Mac 修改用户是一件很悲剧的事&#xff0c;因为牵涉到很多地方的…

pcl使用通道滤波器来滤波

这次我们将展示一个简单的滤波的案例--把不符合的值去掉 代码 #include <iostream> #include <pcl/point_types.h> #include <pcl/filters/passthrough.h>intmain (int argc, char** argv) {pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::Po…

教师网络计算机研修日志,教师网络研修日志

《教师网络研修日志》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《教师网络研修日志(2页珍藏版)》请在人人文库网上搜索。1、教师网络研修日志网络研修平台拉近了每一位教育工作者的距离&#xff0c;巨大的网络力量掀起了教研的火热浪潮。研修平台传递着省级专家的…

用体元滤波器进行降低采样

我们这次用voxel filter(体元滤波器)来滤波 #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/filters/voxel_grid.h>int main (int argc, char** argv) {pcl::PCLPointCloud2::Ptr cloud (new pcl::PCLP…

无线多串口服务器,多串口通信服务器

多串口通信服务器 ZLAN5G00A串口服务器是一款机架式16串口RS232/485/422和TCP/IP之间协议转化器。支持16个RS232串口、16个RS485、RS422串口&#xff0c;且RS232支持流控。通过一根网线连接到ZLAN5G00A&#xff0c;实现16个串口同时全双工工作&#xff0c;每路串口可作为TCP服务…

使用统计异常消除滤波器来消除异常

激光扫描可以生成很多点云的数据集。并且&#xff0c;测量误差会导致一些稀疏的异常值使得结果更差。这使得局部点云特征估计变得更加的复杂&#xff0c;产生一些错误的值&#xff0c;使得点云的识别失败。有些不规则的数据可以通过数理统计的方法来消除。我们稀疏异样消除是以…

为什么有的网站要改服务器才能打开吗,为什么有些网站进不了,怎样设置DNS才能进 – 手机爱问...

2006-12-24从22号起就进不了游戏。 按照官方的DNS地址也不行。 有没有广东深圳罗湖区的朋友能进的 麻烦把你们的DNS地址发给我 谢谢对于上述无法登陆游戏的玩家&#xff0c;《神泣》中国运营团队建议您尝试以下方式&#xff0c;通过修改个人电脑的DNS解析服务器地址&#xff0c…

用一个参数化的模型来投影点

这次我们将学着怎么通过一个参数化的模型进行投影。这个参数化的模型是通过一系列的系数---在这里是平面&#xff0c;相当于axbyczd0 下面是代码 #include <iostream>#include <pcl/io/pcd_io.h>#include <pcl/point_types.h>#include <pcl/ModelCoeffi…

云 文件 服务器 只存,云 文件 服务器只存

云 文件 服务器只存 内容精选换一换用户通过管理控制台创建或者导入密钥对后&#xff0c;在购买弹性云服务器时&#xff0c;登录方式选择密钥对&#xff0c;并选择创建或者导入的密钥对。用户购买弹性云服务器成功后&#xff0c;可使用密钥对的私钥登录弹性云服务器。使用的登录…

pcl从一个点云里面导出下标

我们这次将学着使用ExtractIndices滤波器来从一个分割算法中导出点的下标。为了不把这个项目复杂化&#xff0c;我们不会在这里解释分割算法。 我们先建一个extract_indices.cpp 代码 #include <iostream>#include <pcl/ModelCoefficients.h>#include <pcl/i…

sr650服务器cpu型号,至强Gold 联想ThinkSystem SR650评测

今年7月&#xff0c;英特尔发布了至强可扩展处理器。面对新的处理器架构、新的AVX512指令集&#xff0c;需要新的服务器来匹配&#xff0c;需要更新机器&#xff0c;并提供新的软件、管理等套件。联想ThinkSystem SR650与至强可扩展处理器响应而出并被誉为“性能最高的服务器”…

使用一个环境的或者半径异样消除器来进行异样消除

这个文档显示了在滤波模型里面如何使用几个不同的方法来消除点云里面的异常。 第一步我们将使用一个环境消除滤波器来消除不满足环境条件的点云。然后我们将学会如何使用一个RadiusOutlierRemoval滤波器来消除在指定范围内没有达到指定数量邻居的点。 代码 #include <iost…

trailmakers未能连接服务器,Trailmakers联机版

《Trailmakers联机版》是一款可以联机进行的精美3D沙盒世界以创造为核心玩法的动作手游&#xff0c;这款游戏上手起来挺简单轻松的&#xff0c;诸多趣味内容&#xff0c;将让各位玩家们收获到极致的快感&#xff0c;非常的赞&#xff0c;不想错过任何欢乐与趣味的话&#xff0c…

lga775服务器cpu系列,【LGA775处理器 多的不仅是针脚】- 中关村在线

继发布新一代平台后&#xff0c;Intel推出了LGA775封装的P4处理器。这场被业界称为跨越性的技术革命&#xff0c;究竟能为用户带来什么样的变化和感受&#xff1f;它与Socket 478的处理器有何区别呢&#xff1f;● 何为LGA775LGA(Land Grid Array&#xff0c;栅格阵列封装)即So…

pcl点云PCD文件

csdn离线状态下不能保存&#xff0c;白写了。 然后我把官网链接发给你们&#xff0c;自己看吧&#xff0c;累觉不爱..... 点击打开链接

点云文件的操作

读取点云文件 #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h>int main (int argc, char** argv) {pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);if (pcl::io::loadPCDFile…

通过八叉树进行空间分割和搜索

一个octree是一个以树基础为的管理稀疏3-D数据的数据结构。每个中间的节点有8个子节点。在这次&#xff0c;我们将学习怎么使用octree进行稀疏分割和近邻搜索。尤其&#xff0c;我们将解释如何操作"体元近邻搜索"&#xff0c;和"最近邻搜索"和"半径近…

从一个点云里面创建一个深度图

这次&#xff0c;我们将显示如何从一个点云和一个给定的传感器来创造深度图。下面的代码&#xff0c;创建了一个在观察者前面的矩形。 #include <pcl/range_image/range_image.h>int main (int argc, char** argv) {pcl::PointCloud<pcl::PointXYZ> pointCloud;//…

从深度图里面导出边界

这次我们将学着怎么从一个深度图里面导出边界。我们对3种不同种类的点很感兴趣:物体的边框的点&#xff0c;阴影边框点&#xff0c;和面纱点(在障碍物边界和阴影边界)&#xff0c;这是一个很典型的现象在通过雷达获取的3D深度。 下面是代码 /* \author Bastian Steder */#incl…

以相关组为基础的3D物体识别

这次我们要解释如何以pcl_recognition模块来进行3D物体识别。特别地&#xff0c;它解释了怎么使用相关组算法为了聚类那些从3D描述器算法里面把当前的场景与模型进行匹配的相关点对点的匹配。(长难句)。对于每一次聚类&#xff0c;描绘了一个在场景中的可能模型实例&#xff0c…