RoPS特征提取

RoPS为Rotational Projection Statistics的简写,即旋转投影统计特征。RoPS特征具有对点云旋转和平移(即姿态变化)的不变性,具备很强的鉴别力以及对噪声和数据分辨率变化等干扰的良好稳健性。该特征目前已成功应用于三维目标识别、三维模型重建以及三维人脸识别等场景,均获得了优异的性能[1-4]。此外,在多个数据集下的测试结果表明,其性能优于多个现有特征。

本节将首先分析RoPS特征描述算法的理论基础[1-3],进而给出在PCL中的应用实例[5]。RoPS特征理论基础及实验分析详见参考文献[1-3],PCL实例部分参考了PCL官网说明文档[5]。

理论基础

(1)生物视觉认知学启示

生物视觉认知学的相关实验研究结果表明,幼儿对三维物体的识别能力与其观察物体的角度数密切相关。若幼儿从多个角度观察物体,则其识别物体的能力大大提高。此外,幼儿把持及观察物体的方式在很大程度上影响其识别物体的能力。研究结果认为,实现三维物体在人脑中的统一表示需要对来自物体多个视点的信息进行融合,而该融合则依赖于物体主轴所确定的参考框架。因此,幼儿如何旋转观察物体对信息融合的效果具有十分关键的作用。

上述认知学实验结果启示我们,在构建特征描述子时,若能将从多个视点获得的物体表面信息进行融合,将有助于提高特征描述子的鉴别力。此外,在生成特征描述子时,亦可依据物体的表面信息构建一个参考坐标框架,从而获得特征描述子对物体旋转和平移的不变性。

受此启发,提出了RoPS特征提取算法。该RoPS算法包含两个部分,即局部参考坐标框架构建和RoPS特征描述,详见下文叙述。

(2)局部参考坐标框架构建

给定一个关键点和支撑半径,首先得到离关键点的距离小于的局部表面,该局部表面包含个三角形和个顶点。对于第个三角形,假设其顶点为,和,则三角形中的任意一个点均可表示为

 

(1)

其中,且

图1  局部表面点示意图(图片节选自文献[1])

则第个三角形上点的散布矩阵可计算为

 

(2)

那么,局部表面上所有点的总散布矩阵C 可以计算为所有三角形散布矩阵的加权和,即:

 

(3)

其中,是第个三角形的面积与局部表面总面积的比值:

 

(4)

是与关键点到第个三角形中心距离相关的权值:

 

(5)

对该总散布矩阵进行特征值分解,即

 

(6)

其中,是由的降序排列的特征值构成的对角矩阵,包含了对应的特征向量。这三个相互正交的特征向量构成了局部参考坐标框架的基础。然而,这些特征向量的方向是随机的,因此目前得到的局部参考坐标框架不具有良好的可重复提取性。

为消除局部参考坐标框架坐标轴方向的二义性,将每个特征向量指向多数散布向量所指向的方向,因此特征向量与散布向量的内积符号可用于定义特征向量的不模糊方向。具体而言,不模糊特征向量定义为:

 

(7)

其中 为符号函数。类似的,不模糊特征向量可计算为:

 

(8)

给定两个不模糊向量和,向量定义为。由此,得到了关键点的不模糊局部参考坐标框架。在该框架中,原点为关键点,三个坐标轴分别为、和。采用该局部参考坐标框架,从而可获得一个对姿态变化具有不变性的局部特征描述子。

(3)RoPS特征描述

RoPS 特征描述子的生成过程如图2所示。对于一幅输入点云或其Mesh表示(如图2a所示),首先获得每个关键点上对应于支撑半径的局部表面(如图2b所示),进而计算点上的局部参考坐标框架。局部表面上的三角形顶点可构成点云,将该点云变换到局部参考坐标框架下以获得局部特征描述子对物体姿态变化的旋转和平移不变性。变换后的点云记为。

图2  RoPS 特征生成过程示意图(图片节选自文献[1])

RoPS 特征描述子的具体提取步骤如下:

1) 将点云绕轴旋转角度,得到旋转后的点云,如图2(c) 所示。进而将点云投影到、和三个坐标平面上以获得投影点云。由于二维投影较好地保留了局部表面在该视角下的几何形状信息,对点云进行投影可实现三维局部表面的简洁高效描述。

2) 对于投影点云,将其二维包围框均匀划分成个单元格(如图2(d) 所示),并统计落入每个单元格内的投影点数量,从而获得一个的分布矩阵(如图2(e) 所示)。将分布矩阵归一化以使得所有单元格中的数值之和为1,从而获得对数据分辨率变化的不变性。

3) 提取分布矩阵的中心矩和香农熵。分布矩阵的阶中心矩定义为:

 

(9)

分布矩阵的香农熵定义为:

 

(10)

将这些中心矩与香农熵组合起来以得到一个统计向量,如图2(f)所示。进一步将、和平面上的三个统计向量组合起来以得到子特征。该子特征代表了点云绕轴的第次旋转所得到的统计量,如图2(g) 所示。

4) 为全面记录局部表面的信息,将点云绕轴旋转一系列角度,从而得到一系列子特征。然后,将点云绕轴旋转一系列角度以得到一系列子特征。最后,将点云绕轴旋转一系列角度以得到一系列子特征。

5) 将所有子特征连接起来便得到最终的RoPS特征描述子,即:

 

(11)

由于RoPS 特征描述子从多个角度记录了局部表面的几何信息,因此其拥有很高的鉴别力。事实上,RoPS 特征提取算法与生物认知学机理存在许多相通之处。首先,RoPS 算法中将关键点支撑域内的邻域点绕三个坐标轴进行旋转并投影到三个坐标平面以得到一系列投影点分布矩阵的过程,类似于人眼从多个视点对三维物体进行二维成像的过程。其次,该算法采用少量统计矩记录每个投影点云分布矩阵信息的过程则类似人脑对图像信息的抽象理解过程。最后,该算法将所有统计矩信息连接得到RoPS 特征描述子的过程类似人脑对多视图像信息的融合理解及记忆过程。

(4)推荐算法参数及说明

实验表明,如下参数能取得很好的性能:包围矩形划分单元格数取为5,绕每个坐标轴的旋转次数取为3,每个分布矩阵采用向量描述。

需要注意的是,上述第(2)节中只给出了mesh数据格式(包含点和面元信息)下计算关键点处局部参考坐标框架的方法。若数据为点云表示(没有面元信息),则有两种解决方案。一是首先将点云采用三角化算法转化为mesh数据格式,然后采用上述方法计算局部参考坐标框架和RoPS特征描述子;而是采用其它算法(如SHOT)中的局部参考坐标框架模块计算局部参考坐标框架,而后在该局部参考坐标框架的基础上计算RoPS特征描述。

PCL应用实例详解

下文具体给出采用PCL计算点云RoPS特征的程序实例。

版本要求:PCL1.7.2

输入数据:

points – 输入点云

l indices – 需要计算RoPS特征的点的标号,即关键点的标号

l triangles – 三角面元

(1)包含头文件

#include <pcl/features/rops_estimation.h>

#include <pcl/io/pcd_io.h>

(2)加载点云cloud

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

if (pcl::io::loadPCDFile (argv[1], *cloud) == -1)

   return (-1);

(3)加载点云中需要计算RoPS特征的关键点的标号indices。若对点云中的每一个点均需要计算RoPS特征,则可以将以下代码注释。

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 ();

(4)加载Mesh的面元信息triangles。若输入的为纯点云(没有面元信息)而非Mesh,则将下述代码替换为三角化(triangulation)程序。

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);

}

(5)设置用于RoPS特征提取的参数:

设置局部邻域大小的支撑半径support_radius,该数值越大,包含的表面信息越多,但同时受遮挡和背景干扰的影响也越大。极端的,若该支撑半径能将一个场景的所有点云均包含进去,则提取到的特征为全局特征。推荐设置为点云分辨率的15倍。

设置获得分布矩阵的投影平面划分单元格数number_of_partition_bins,推荐设置为5。

设置绕每个坐标轴的旋转次数number_of_rotations,推荐设置为3。

float support_radius = 0.0285f;

unsigned int number_of_partition_bins = 5;

unsigned int number_of_rotations = 3;

(6)设置特征提取算法中使用到的邻域点搜索函数,如k-d树。

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

search_method->setInputCloud (cloud);

(7)实例化pcl::ROPSEstimation类。

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);

(8)计算RoPS特征。

pcl::PointCloud<pcl::Histogram <135> >::Ptr histograms (new pcl::PointCloud <pcl::Histogram <135> > ());

feature_estimator.compute (*histograms);

参考文献

[1] Yulan Guo, Ferdous Sohel, Mohammed Bennamoun, Min Lu, Jianwei Wan. Rotational Projection Statistics for 3D Local Surface Description and Object Recognition. International Journal of Computer Vision. 2013, 105 (1): 63-86.

[2] Yulan Guo, Mohammed Bennamoun, Ferdous Sohel, Min Lu, Jianwei Wan. 3D Object Recognition in Cluttered Scenes with Local Surface Features: A Survey. IEEE Transactions on Pattern Analysis and Machine Intelligence. 2014, 36 (11): 2270-2287.

[3] 郭裕兰. 点云局部特征描述与三维目标重建识别技术研究. 国防科学技术大学研究生院. 博士学位论文. 2015.

[4] Yulan Guo, Ferdous Sohel F, Mohammed Bennamoun, Jianwei Wan, Min Lu. An Accurate and Robust Range Image Registration Algorithm for 3D Object Modeling. IEEE Transactions on Multimedia. 2014, 16 (5): 1377-1390.

[5] PCL官网RoPS特征使用说明. http://pointclouds.org/documentation/tutorials/rops_feature.php

RoP的更多相关文章

  1. 一步一步学ROP之linux_x64篇

    一步一步学ROP之linux_x64篇 一.序 **ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防 ...

  2. 一步一步学ROP之linux_x86篇

    一步一步学ROP之linux_x86篇 作者:蒸米@阿里聚安全 ​ 一.序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过 ...

  3. Windows XP PRO SP3 - Full ROP calc shellcode

    /*     Shellcode: Windows XP PRO SP3 - Full ROP calc shellcode     Author: b33f (http://www.fuzzysec ...

  4. Rop 文件上传解决思路

    由于服务请求报文是一个文本,无法直接传送二进制的文件内容,因此必须采用某种转换机制将二进制的文件内容转换为字符串.Rop 采用如下的方式对上传文件进行编码:<fileType>@<B ...

  5. rop框架签名功能控制

    平台级控制: 通过<rop:annotation-driven/>的 sign-enable 属性即可开启或关闭服务平台签名验证功能:<rop:annotation-driven s ...

  6. rop框架中@ServiceMethod注解属性

    @ServiceMethod 属性 method :代码服务方法名version :表 示 版 本 号 group:服务分组名.服务的分组没有特殊的意义,您可以为服务定义一个分组,以便在事件监听器.服 ...

  7. Linux内核ROP学习

    0x00 前言 1.SMEP(Supervisor Mode Execution Protection):一种减缓内核利用的cpu策略,禁止内核态到用户态内存页的代码执行(32位的addresses ...

  8. 栈溢出之rop到syscall

    当程序开启了nx,但程序有syscall调用的时候.这时栈溢出的利用就可以通过rop来执行syscall的59号调用execve('/bin/sh',null,null),这是这次alictf一道pw ...

  9. 20145236《网络对抗》进阶实验——64位Ubuntu 17.10.1 ROP攻击

    20145236<网络对抗>进阶实验--64位Ubuntu 17.10.1 ROP攻击 基础知识 ROP攻击 ROP全称为Retrun-oriented Programmming(面向返回 ...

  10. 蒸米一步一步ROP X64学习笔记

    原文地址https://segmentfault.com/a/1190000007406442,源代码地址https://github.com/zhengmin1989/ROP_STEP_BY_STE ...

随机推荐

  1. ECharts简单入门demo

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. linux环境下安装python3的方法(转)

    Linux 安装python3.7.0   我这里使用的时centos7-mini,centos系统本身默认安装有python2.x,版本x根据不同版本系统有所不同,可通过 python --V 或 ...

  3. 一个简单的例子学会github repository的webhook

    github的webhook是个有用的功能,允许开发人员指定一个服务器的url.当开发者对github仓库施加操作,比如提交代码,创建issue时,github网站会自动向该url指定的服务器推送事件 ...

  4. Python3 GUI:PyQt5环境搭建

    配置镜像源 最近用Python内置的Thinter写了个小工具,发现界面略朴素,于是决定转向PyQt5.先配置镜像源,否则只能龟速下载. C:\Users\你的用户名下新建目录pip 在pip目录下新 ...

  5. linux下安装db2

    最近研究了一下在 ubuntu下安装db2的过程,很快就完成安装,特贴出来供大家讨论,如有错误请多多指教. 注意:安装过程请使用root用户,否则会出现安装失败的情况: 安装过程: 准备工作: 准备安 ...

  6. os.path:平台独立的文件名管理

    介绍 利用os.path模块中包含的函数,很容易编写代码来处理多个平台上的文件 解析路径 import os.path ''' os.path中的第一组函数可以用来将表示文件名的字符串解析为文件名的各 ...

  7. 使用EasyUI查询与删除

    下面我们创建一个使用EasyUI布局的asp.net网站查询与删除数据(连接数据库) 新建网站-新建数据库(一个表,主要作用是了解一下easyUI的使用) 打开EasyUI帮助文档,自行渲染 使用da ...

  8. 关于pycharm database查看db.sqlites文件提示:Driver class 'org.sqlite.JDBC' not found

    系统重新安装后,启动pycharm存在各种问题,其中一个问题就是在Pycharm中的database里面不能查看sqlite数据库了: 经过一番查找终于找到了问题: 首先问题 是提示这样一个报错: 解 ...

  9. linux批量添加用户和批量修改密码

    一.批量创建用户通过命令newusers可以实现批量的创建用户.这个命令的用法为 newusers file.txt(一个文本文件)文本文件内存放需要批量添加的用户信息但是对格式有要求格式:pw_na ...

  10. 利用collections下的counter实现对列表重复元素的查重

    mylist = [0,1,1,2,2,3,3,3,3,4,5,6,7,7,8,8,9,10,10,11,22,33,22] from collections import Counter c = C ...