[MATLAB 포인트 클라우드 처리] FPFH 계산 및 시각화

FPFH: Fast Point Feature Histogram
참조 링크: 1. FPFH 알고리즘의 구현 원리와 포인트 클라우드 등록에서의 응용에 대해 이야기하기
2. FPFH(Fast Point Feature Histogram) 기능은
3D 포인트 클라우드 등록(포인트 클라우드 등록)에서 사용됩니다. 일반적으로 기능과 RANSAC을 기반으로 러프 매칭을 먼저 수행한 다음 미세 매칭을 수행합니다. 러프매칭에서 흔히 사용되는 기능은 FPFH 기능이고, 미세매칭은 일반적으로 ICP(Iterative Nearest 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. 3D 포인트 클라우드 변환: 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() 함수: 일치점 쌍으로부터 3D 기하 변환 추정

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

Supongo que te gusta

Origin blog.csdn.net/weixin_44769034/article/details/129861523
Recomendado
Clasificación