FPFH特征提取以及匹配(matlab代码免费)

news2024/9/23 17:18:48

FPFH特征提取时谁提出的,尊重一下原创:

[1] Rusu, Radu Bogdan, Nico Blodow, and Michael Beetz. “Fast point feature histograms (FPFH) for 3D registration.” In 2009 IEEE International Conference on Robotics and Automation, pp. 3212-3217. IEEE, 2009.

地址:
【免费】(2009FPFH)Fast-Point-Feature-Histograms-FPFH-for-3D-registratio资源-CSDN文库icon-default.png?t=N7T8https://download.csdn.net/download/Vertira/88910855

 在matlab中,已经封装成一个函数即: extractFPFHFeatures(),下面是在matlab中的详细解释

help extractFPFHFeatures
 extractFPFHFeatures - Extract fast point feature histogram (FPFH) descriptors from point cloud
    This MATLAB function extracts FPFH descriptors for each valid point in
    the input point cloud object.

    features = extractFPFHFeatures(ptCloudIn)
    features = extractFPFHFeatures(ptCloudIn,indices)
    features = extractFPFHFeatures(ptCloudIn,row,column)
    [___,validIndices] = extractFPFHFeatures(___)
    [___] = extractFPFHFeatures(___,Name,Value)

    输入参数
        ptCloudIn - Point cloud
            pointCloud object
        indices - Linear indices of selected points
            vector of positive integers
        row - Row indices of selected points
            vector of positive integers
        column - Column indices of selected points
            vector of positive integers

    名称-值参数
        NumNeighbors - Number of neighbors for KNN search
            50 (默认值) | positive integer
        Radius - Radius considered for radius search
            0.05 (默认值) | positive real-valued scalar

    输出参数
        features - FPFH descriptors
            N-by-33 matrix of positive real values
        validIndices - Linear indices of valid points
            vector of positive integers

    打开示例
        Extract FPFH Descriptors at Selected Indices in Point Cloud

    See also pcread, pcdownsample, pcnormals, pcshow, pointCloud

    在 R2020b 中引入
    extractFPFHFeatures 的文档

使用这个函数的方法1

 features = extractFPFHFeatures(ptCloudIn)

 提取输入点云对象中每个有效点的FPFH描述符。该函数以N× 33矩阵的形式返回描述符,其中N是输入点云中的有效点的数量。

方法2:

features = extractFPFHFeatures(ptCloudIn,indices)

提取有效指定indices位置的特征。(这个indices可以是数组)

方法3:

features = extractFPFHFeatures(ptCloudIn,row,column)

 在输入的有组织点云ptCloudn的指定的二维索引处提取有效点的FPFH描述符。将点的行索引和列索引分别指定为行和列。

row:有序点云中选定点的行索引,指定为正整数的向量。行向量和列向量的长度必须相同。数据类型:Data Types: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
column:有序点云中选定点的列索引,指定为正整数的向量。行向量和列向量的长度必须相同。数据类型同上

方法4 ;

[___,validIndices] = extractFPFHFeatures(___)

 返回已提取FPFH描述符的点云中有效点的索引。

方法5:

 [___] = extractFPFHFeatures(___,Name,Value)

除了前面语法中的参数组合外,还使用一个或多个名称-值对参数指定选项。描述符的提取可以采用KNN搜索法、半径搜索法或两者的结合。extractFPFHFeatures函数默认使用KNN搜索方法提取描述符。用户可以通过名称值对参数选择提取方法。例如,extractFPFHFeatures(___,‘NumNeighbors’,8),选择KNN搜索方法提取描述符,并将k-nearest neighbor (KNN)搜索方法中需要考虑的最大邻居数设置为8。

输出参数
features:FPFH 描述符,作为正实数值的 N x 33 矩阵返回。N 是函数从中提取 FPFH 描述符的有效点数。每列都包含点云中有效点的 FPFH 描述符。若要另外返回提取点的索引,请使用有效的validIndices输出参数。
validIndices:有效点的线性索引,指定为正整数的向量。向量仅包含函数提取特征的那些点的索引。

代码实现:

%将数据加载到工作区
ptObj = pcread('bunny.ply');
%数据下采样(点太多了,整少点)
ptCloudIn = pcdownsample(ptObj,'gridAverage',0.05);
%提取指定索引出点的FPFH描述符(这里也就是提取的第6565和10000这两个点的FPFH描述符)
keyInds = [6565 10000];
features = extractFPFHFeatures(ptCloudIn,keyInds);
%显示点云上的关键点
ptKeyObj = pointCloud(ptCloudIn.Location(keyInds,:),'Color',[255 0 0;0 0 255]);
figure
pcshow(ptObj)
title('Selected Indices on Point Cloud')
hold on
pcshow(ptKeyObj,'MarkerSize',1000)
hold off
%把上面指定的那两个点的FPFH描述符显示出来
figure
ax1 = subplot(2,1,1);
bar(features(1,:),'FaceColor',[1 0 0])
title('FPFH Descriptors of Selected Indices')
ax2 = subplot(2,1,2);
bar(features(2,:),'FaceColor',[0 0 1])
linkaxes([ax1 ax2],'xy')

运行后的结果

FPFH直方图:(代码中选取的是两个点用来输出FPFH,因此这里展示的是两个点的快速点特征直方图。)

 

 

2 根据FPFH特征查找匹配点对

寻找点云之间的匹配特征,算法理论大部分来自论文《Fast global registration》

A 主要函数 pcmatchfeatures
>> help pcmatchfeatures
 pcmatchfeatures - Find matching features between point clouds
    This MATLAB function finds matching features between the input matrices
    of extracted point cloud features and returns their indices within each
    feature matrix.

    indexPairs = pcmatchfeatures(features1,features2)
    indexPairs = pcmatchfeatures(features1,features2,ptCloud1,ptCloud2)
    [indexPairs,scores] = pcmatchfeatures(___)
    [___] = pcmatchfeatures(___,Name,Value)

    输入参数
        features1 - First feature set
            M_{1}-by-N matrix
        features2 - Second feature set
            M_{2}-by-N matrix
        ptCloud1 - First point cloud
            pointCloud object
        ptCloud2 - Second point cloud
            pointCloud object

    名称-值参数
        Method - Matching method
            'Exhaustive' (默认值) | 'Approximate'
        MatchThreshold - Matching threshold
            0.01 (默认值) | scalar in the range (0, 1]
        RejectRatio - Spatial relation threshold
            0.95 (默认值) | scalar in the range (0,1)

    输出参数
        indexPairs - Indices of matched features
            P-by-2 matrix
        scores - Normalized Euclidean distance between matching features
            P-element column vector

    打开示例
        Match Corresponding Features in Point Clouds

    See also pcshowMatchedFeatures, extractFPFHFeatures

    在 R2020b 中引入
    pcmatchfeatures 的文档

 

输入参数

features1:第一个特征集(就是用FPFH对原点云提取的特征)
features2:第二个特征集(就是用FPFH对被移动的云提取的特征)
ptCloud1:第一个输入点云,指定为pointCloud对象
ptCloud2:第二个输入点云,指定为pointCloud对象
输出参数

indexPairs:匹配特征的索引值(就是找到的特征点是对应原点云的那个点)。返回的是P×2矩阵P是匹配特征的数目。每一行的第一个元素是特征1中的索引值,第二个元素是特征2的索引值。
Scores:归一化欧氏距离特征。返回的一个列向量,所以这个列向量里面的元素代表了匹配特征之间的距离。(所以这个值越小,表示匹配的越好)

代码:

clc;
clear;
%%
%数据载入并预处理

%将点云数据读入工作区。
ptCld = pcread('bunny.ply');
%下采样
ptCloud = pcdownsample(ptCld,'gridAverage',0.4);
%%
%把原点云做一个旋转平移,得到另外一个点云(方法很多。1.这里使用的是仿射矩阵affine3d+pctransform结合。2.也可以直接自己写一个变换矩阵,然后对每一个点遍历分别变换也行 
%3.也可以自己写一个变换矩阵T,然后把xyz数据放在列上全部变成3×n的矩阵,然后在最后一行加一个全1的一行变成4×n的矩阵,然后拿去乘变换矩阵T就行了)

%使用转换矩阵A转换并创建一个新的点云。
A = [cos(pi/6) sin(pi/6) 0 0; ...
    -sin(pi/6) cos(pi/6) 0 0; ...
            0         0  1 0; ...
            10         10 0 1];     
tform = affine3d(A);%仿射变换=线性变换+平移
ptCloudTformed = pctransform(ptCloud,tform);
%%
%可视化两个点云
pcshowpair(ptCloud,ptCloudTformed);

%%
%找两点云相互匹配对应特征。
%1.先使用ExtractFPFHFeature函数,从两个点云中提取FPFH特征
[fixedFeature,fixed_Ind] = extractFPFHFeatures(ptCloud);
[movingFeature,moving_Ind]= extractFPFHFeatures(ptCloudTformed);
%2.使用pcmatchfeatures函数找到两点云FPFH匹配的特征,返回的是点云的点对序列号(以矩阵n×2的形式返回),Score表示
[indexPairs,Score] = pcmatchfeatures(fixedFeature,movingFeature,ptCloud,ptCloudTformed);



%%
%用连接线显示两点云找到的匹配点(用这个函数即可pcshowMatchedFeatures)——这里图想要看的清除,下采样那里把阈值改大一点即可
%1.pcshowMatchedFeatures函数形参的预处理,把输入数据变成pointcloud类格式(形参都是pointcloud格式,但是我不会写pointcloud格式,但是我发现用seclect可以变成这种格式)
movingFeature_Ind = [1:size(movingFeature)]';
fixedFeature_Ind = [1:size(fixedFeature)]';
MovingFeature = select(ptCloud,movingFeature_Ind);%把movingFeature变成pointcloud类形式,才能作为pcshowMatchedFeatures形参的输入
FixedFeature = select(ptCloudTformed,fixedFeature_Ind);

matchedFixedPts = select(ptCloud,indexPairs(:,1));%select实现的是:可以从ptCloud点云中,挑选出为indexPairs里面序列的点,并转成pointcloud的形式。
matchedMovingPts = select(ptCloudTformed,indexPairs(:,2));

%2.用连接线链接匹配点
figure
pcshowMatchedFeatures(MovingFeature,FixedFeature,matchedMovingPts,matchedFixedPts)
% xlim([-40 210])
% ylim([-50 50])
title('Matched Points')

运行结果

 

 

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

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

相关文章

websocket在java中的使用教程

本文从websocket服务端和客户端两个方面简单介绍下websocket在java中的使用。 一、websocket服务端(WebSocketServer) websocket服务端是以本机作为消息的接受端,用于接受客户端websocket发送过来的消息,并可以通过客户端的webs…

06_netdev网卡设备内核模块

01_basicLinux内核模块-CSDN博客文章浏览阅读315次&#xff0c;点赞3次&#xff0c;收藏3次。环境IDubuntuMakefilemodules:clean:basic.creturn 0;运行效果。https://blog.csdn.net/m0_37132481/article/details/136157384my_netdev.c #include <linux/kernel.h> #incl…

Unity 使用AddListener监听事件与取消监听

在Unity中&#xff0c;有时候我们会动态监听组件中的某个事件。当我们使用代码动态加载多次&#xff0c;每次动态加载后我们会发现原来的和新的事件都会监听&#xff0c;如若我们只想取代原来的监听事件&#xff0c;那么就需要取消监听再添加监听了。 如实现如下需求&#xff…

yml代替properties文件进行springboot项目配置

任务&#xff1a;使用yml格式文件代替properties格式文件进行便捷有效的springboot项目配置。 原先&#xff1a; 在与application.properties文件同级目录下新建application.yml文件&#xff0c;以上配置内容修改为&#xff1a; 注&#xff1a;yml文件的一些编写规范

前端爬虫+可视化Demo

爬虫简介 可以把互联网比做成一张 “大网”&#xff0c;爬虫就是在这张大网上不断爬取信息的程序。 爬虫是请求网站并提取数据的自动化程序。 省流&#xff1a;Demo实现前置知识&#xff1a; JS 基础Node 基础 &#xff08;1&#xff09;爬虫基本工作流程&#xff1a; 向…

跨境电商必看:跨境出海实用工具!

对于想要出海扩展业务的电商从业者来说&#xff0c;用好工具和资源至关重要。本文将分享一些跨境出海的使用工具&#xff0c;助力跨境业务。 关键词工具 Google Trends&#xff08;谷歌趋势&#xff09;&#xff1a; 它的数据来源于谷歌搜索&#xff0c;依靠Google全世界数十…

R语言简介、环境与基础语法及注释

R语言简介、环境与基础语法及注释 一、R语言1.R语言简介2.R语言官网3.R语言中国的镜像网站4.R语言下载5.R语言的历史 二、R语言环境1.Windows安装1.1 去 R 语言下载的镜像站点的列表下载1.2 选择版本进行下载1.3 点击运行1.4 一路默认&#xff0c;安装完毕&#xff01; 2.Linux…

maven配置文件(一)Settings配置

一、仓库 1、关系 我们依赖的外部服务是需要有地方进行存储的&#xff0c;而存储的地方就称之为仓库。其中仓库又分为本地仓库、中央仓库、镜像仓库、私服。 &#xff08;1&#xff09;本地仓库 当项目在本地编译或运行时&#xff0c;直接加载本地的依赖服务无疑是最快的。默…

[计算机网络]:流量控制

一、流量控制简介 一条TCP连接的每一侧主机都为其设置了接收缓存&#xff0c;当TCP成功连接后&#xff0c;它发送的数据会放入接受缓存中。相关联的进程会从缓存中读取数据。但是存在一个问题&#xff0c;当某应用程序读取数据速率太慢&#xff0c;而发送数据一方不停的发送数…

Flutter学习8 - 网络编程 Http

1、配置 Http 依赖 Flutter 工具库搜索地址&#xff1a;https://pub.dev/ http最新版本查看网址&#xff1a; https://pub.dev/packages/http 在 pubspec.yaml 中引入 http 插件 dependencies:flutter:sdk: flutterhttp: ^0.13.4 # 请检查并使用最新版本命令行中输入 “ flut…

【C语言基础】:深入理解指针(二)

文章目录 深入理解指针一、指针运算1. 指针 - 整数2. 指针 - 指针3. 指针的关系运算 二、野指针1. 野指针成因2. 如何避免野指针 三、assert断言四、指针的使用和传址调用4.1 strlen的模拟实现4.2 传值调用和传址调用 五、指针与数组5.1 数组名的理解5.2 指针访问数组5.3 一维数…

蓝桥杯-单片机组基础7-存储器映射扩展与PWM脉冲调制(附小蜜蜂课程代码)

蓝桥杯单片机组备赛指南请查看这篇文章&#xff1a;戳此跳转蓝桥杯备赛指南文章 本文章针对蓝桥杯-单片机组比赛开发板所写&#xff0c;代码可直接在比赛开发板上使用。 型号&#xff1a;国信天长4T开发板&#xff08;绿板&#xff09;&#xff0c;芯片&#xff1a;IAP15F2K6…

HCIA-HarmonyOS设备开发认证V2.0-习题

目录 习题一习题二习题三&#xff08;待续...&#xff09;坚持就有收获 习题一 # HarmonyOS简介 1. 以下哪几项属于OpenHarmony的技术特性&#xff1f;&#xff08;&#xff09;A. 统一OS&#xff0c;弹性部署B. 一次开发&#xff0c;多端部署C. 硬件互助&#xff0c;资源共享…

基于数字孪生的机场人群智慧管控技术

源自&#xff1a;系统仿真学报 作者&#xff1a;钟竞辉,林育钿,李稳强&#xff0c;蔡文桐 “人工智能技术与咨询” 发布 摘 要 针对机场人群应急管控和管理智能化的需求&#xff0c;提出基于数字孪生的机场人群智慧管控方案。构建了包含数据层、建模层、功能层和应用层四维…

【JavaEE进阶】 Linux搭建Java部署环境

文章目录 &#x1f343;前言&#x1f334;Linux权限&#x1f6a9;用户操作&#x1f6a9;三种角色&#x1f6a9;文件类型和访问权限&#x1f388;文件类型&#x1f388;基本权限 &#x1f6a9;修改文件权限 &#x1f38d;搭建Java部署环境&#x1f6a9;apt&#x1f388;apt常用命…

【c++】STL--List的实现

目录 一. List的数据结构 二. List实现的基本框架 1. list的结点结构类 2. List的迭代器类 正向迭代器 反向迭代器 3. List操作接口的实现 1. 默认成员函数 构造函数 和 析构函数 拷贝构造函数 和 赋值运算符重载 2. 修改相关函数接口 insert 和 erase …

人大金仓KingbaseES:windows安装

人大金仓KingbaseES&#xff1a;windows安装 产品简介 金仓数据库管理系统[简称:KingbaseES]是北京人大金仓信息技术股份有限公司&#xff08;简称人大金仓&#xff09;自主研发的、具有自主知识产权的商用关系型数据库管理系统&#xff08;DBMS&#xff09;。该产品面向事务…

春日特惠,爱基百客限时放送,开启您的学术新篇章!

春回大地&#xff0c;万物复苏&#xff0c; 正是探索未知、启发新思的最佳时节。 在这个充满生机的季节里&#xff0c; 我们推出了春季大促活动&#xff0c; 旨在助力每一位科研工作者在新的一年里实现更多突破。 让我们一起迎接科研人的春天&#xff0c; 开启智慧的花朵…

初阶数据结构:二叉树(补充扩展)

目录 1. 堆排序1.1补充&#xff1a;建堆的时间复杂度1.2 堆排序&#xff1a;升序与降序 2. TopK问题3. 二叉树的链式结构及其遍历方式3.1 二叉树的链式结构3.2 二叉树的前序遍历2.2 二叉树的中序遍历2.3 后序遍历2.4 层序遍历 4. 二叉树OJ练习4.1 单值二叉树4.2 判断两棵二叉树…

“零碳未来”:引领全球向低碳经济转型

全球环境基金(GEF),这个由183个国家和地区组成的国际合作组织,是世界银行1990年创建的实验项目,一直致力于支持环境友好型项目,推动全球环境改善。而“零碳未来”不仅是一个由全球环境基金(GEF)创建的跨越国界的全新交易平台,更是一个致力于推动全球向低碳经济转型的零碳排放生…