当前位置: 首页 > article >正文

【MATLAB点云处理】计算FPFH并可视化

FPFH:快速点特征直方图
参考链接:1.浅谈FPFH算法实现原理及其在点云配准中的应用
2.Fast Point Feature Histogram (FPFH)特征
在做三维点云匹配(Point cloud registration)的时候,通用的做法是先做基于特征及RANSAC的粗匹配,然后再做一轮精匹配。粗匹配常使用的一种特征是FPFH特征,而精匹配一般使用的是ICP(Iterative closest point)的方法。本文主要是记录FPFH特征:

MATLAB相关函数

1.extractFPFHFeatures()函数

features = extractFPFHFeatures(ptCloudIn)
提取输入点云对象中每个有效点的FPFH描述符。该函数以N X33矩阵的形式返回描述符,其中N是输入点云中的有效点的数量。
features = extractFPFHFeatures(ptCloudIn,indices) 
提取给定索引处的有效点的FPFH描述符
[___,validIndices] = extractFPFHFeatures(___)
返回已提取FPFH描述符的点云中有效点的索引
[___] = extractFPFHFeatures(___,Name,Value)
除了前面语法中的参数组合外,还使用一个或多个名称-值对参数指定选项。描述符的提取可以采用KNN搜索法、半径搜索法或两者的结合。extractFPFHFeatures函数默认使用KNN搜索方法提取描述符。用户可以通过名称-值对参数选择提取方法。例如,NumNeighbors’,8选择KNN搜索方法提取描述符,并将k-nearest neighbor (KNN)搜索方法中需要考虑的最大邻居数设置为8

名称-值对应参数
NumNeighbors: KNN搜索方法的邻居数量,指定为逗号分隔对,由“NumNeighbors”和一个正整数组成。KNN搜索方法是计算点云中某一点与其相邻点之间的距离,并对其进行升序排序。最近的点被认为是邻居。NumNeighbors设置要考虑的邻居数量的上限。默认值为: 50
Radius: 半径搜索方法考虑的半径,指定为由Radius和一个正实值标量组成的逗号分隔对。半径搜索方法设置一个特定的半径围绕一个点,并选择在给定半径内的所有相邻点作为邻居。默认值为: 0.05
注意:
如果为“NumNeighbors”和“Radius”名称-值对参数指定值,extractFPFHFeatures函数将执行KNN搜索方法,然后只选择给定半径内的集合。如果为“NumNeighbors”和“Radius”指定较大的值,则内存占用和计算时间会增加。

程序:

clc;clear all;close all;
%将点云数据加载到工作区。
ptObj = pcread('E:\程序库\点云\规则点云\bunny.pcd');
%对点云数据进行降采样。
ptCloudIn = pcdownsample(ptObj,'gridAverage',0.005);%平均网格下采样,网格滤波器将点云空间分成小块,并且把每个方块中的点进行平均,生成新的数据。
%提取指定关键索引点的FPFH描述符。
indic=[323,2311];
features=extractFPFHFeatures(ptCloudIn,indic);

%显示点云上的关键点
keypcshow=pointCloud(ptCloudIn.Location(indic,:),'Color',[0,0,1;0,1,1]);%先定义点的坐标及颜色属性
figure
pcshow(ptObj)%点云可视化
title('Selected Indices on Point Cloud')
hold on
pcshow(keypcshow,'MarkerSize',1000)%关键点可视化
hold off

%关键点提取的FPFH描述符。
figure;title('FPFH Descriptors of Selected Indices');
subplot(211);bar(features(1,:),'Facecolor',[0,0,1]);
subplot(212);bar(features(2,:),'Facecolor',[0,1,1]);

运行结果:

在这里插入图片描述
在这里插入图片描述

2.pcmatchfeatures() 函数

参考博客:matlab 点云粗配准(2)—— 根据FPFH特征查找匹配点对(Fast Global Registration算法的部分实现)

indexPairs = pcmatchfeatures(features1,features2)
在提取的点云特征的输入矩阵之间找到匹配的特征,并在每个特征矩阵中返回它们的索引。
indexPairs = pcmatchfeatures(features1,features2,ptCloud1,ptCloud2)
剔除基于与特征矩阵对应的点云的空间关系信息的模糊特征匹配
[indexPairs,scores] = pcmatchfeatures(___)
使用以前语法中的任何输入参数组合,返回匹配功能之间的归一化欧氏距离.
[___] = pcmatchfeatures(___,Name,Value) 
除了以前语法中的任何参数组合之外,还指定使用一个或多个百-目应参数的选项。例如“MatchThresHolding”,0.03将匹配特性的归一化距离闻值设置为0.03

3.点云中的select()函数

select():选择点云中的点。

ptCloudOut = select(ptCloud,indices)
返回索引对应的点云对象
ptCloudOut = select(___,'OutputSize',outputSize)
返回点云对象 点云对象的大小由outputSize指定。

4.三维点云的变换 : pctransform()

ptCloudOut = pctransform(ptCloudIn,tform)
将指定的3-D仿射变换tform应用于点云ptCloudin。变换可以是刚性变换或非刚性变换

程序:

clc;clear all;close all;
%将点云数据加载到工作区。
ptObj = pcread('E:\程序库\点云\规则点云\bunny.pcd');
%对点云数据进行降采样。
ptCloudIn = pcdownsample(ptObj,'gridAverage',0.005);%平均网格下采样,网格滤波器将点云空间分成小块,并且把每个方块中的点进行平均,生成新的数据。
%提取指定关键索引点的FPFH描述符。
indic=[323,2311];
features=extractFPFHFeatures(ptCloudIn,indic);

%显示点云上的关键点
keypcshow=pointCloud(ptCloudIn.Location(indic,:),'Color',[0,0,1;0,1,1]);%先定义点的坐标及颜色属性
figure
pcshow(ptObj)%点云可视化
title('Selected Indices on Point Cloud')
hold on
pcshow(keypcshow,'MarkerSize',1000)%关键点可视化
hold off

%关键点提取的FPFH描述符。
figure;
subplot(211);bar(features(1,:),'Facecolor',[0,0,1]);
title('FPFH Descriptors of Selected Indices');
subplot(212);bar(features(2,:),'Facecolor',[0,1,1]);


%使用转换矩阵A转换并创建一个新的点云。
theta = pi/4;
rot = [cos(theta) sin(theta) 0; ...
      -sin(theta) cos(theta) 0; ...
               0          0  1];
trans = [0, 0, 0];
tform = rigid3d(rot,trans);   
ptCloudTformed = pctransform(ptCloudIn,tform);
figure;pcshowpair(ptCloudIn,ptCloudTformed);
legend("Original", "Transformed","TextColor",[1 1 0]);
fixedFeature = extractFPFHFeatures(ptCloudIn);
movingFeature = extractFPFHFeatures(ptCloudTformed);
length(movingFeature)
%找到匹配的特征。
[matchingPairs,scores] = pcmatchfeatures(fixedFeature,movingFeature,ptCloudIn,ptCloudTformed);
length(matchingPairs)
%计算匹配的分,值越小表示匹配的越好
mean(scores)

matchedPts1 = select(ptCloudIn,matchingPairs(:,1));%返回matchingPairs(:,1)索引号对应的点云
matchedPts2 = select(ptCloudTformed,matchingPairs(:,2));
figure
pcshowMatchedFeatures(ptCloudIn,ptCloudTformed,matchedPts1,matchedPts2, ...
    "Method","montage")

title("Matched Points")

运行结果:

在这里插入图片描述
在这里插入图片描述

5.estgeotform3d()函数:从匹配点对估计三维几何变换

tform = estgeotform3d(matchedPoints1,matchedPoints2,transformType)
通过将来自一组三维点matchedPoints1的匹配点中的内变量映射到来自一组三维点matchedPoints2的匹配点中的内变量,估计两组三维点之间的三维几何变换。
[tform,inlierIndex] = estgeotform3d(___) 

http://www.kler.cn/a/5993.html

相关文章:

  • 在 macOS 中,设置自动将文件夹排在最前
  • 常见的开源网络操作系统
  • 【gRPC】Keepalive连接保活配置,go案例
  • c++ 17 constexpr
  • 洛谷:P1540 [NOIP2010 提高组] 机器翻译
  • 【大模型】百度千帆大模型对接LangChain使用详解
  • process.spider_loader.list()为空列表是什么原因导致的?KeyError: ‘Spider not found
  • C#基本语法和数据类型
  • 慕了,这些地区软考没过45分居然也能拿证?
  • 浅谈JVM(四):运行时数据区
  • 【竞赛经历】CSDN第40期竞赛题解
  • 年薪50W京东软件测试工程师的成长路 —— 我们都曾一样迷茫
  • [精通Linux]-102-shell 命令学习
  • 第十六章 开课对谈
  • mybatis中判断传入的数组与集合是否为空
  • pyinotify 模块来实现对文件的监控
  • GNU-Radio简介
  • npx 使用教程
  • 二叉搜索树——C语言描述——创建,查找,增加,删除结点
  • 日结(3.26
  • 基于chatGPT插件开发
  • C的实用笔记36——几种常用的字符串处理API(一)
  • 当营养遇上肠道菌群:探究其对儿童健康的影响
  • STM32基于STM32CubeMX硬件I2C驱动MPU6050读取数据
  • vue尚品汇商城项目-day01【6.Footer组件的显示与隐藏】
  • C++基础学习笔记(六)——提高编程PART1