使用MATLAB实现点云内部形态描述子 (Intrinsic Shape Signatures, ISS)
提示:使用前需先下载置顶博客《自定义MATLAB点云函数集》,并将文件夹添加到MATLAB搜索路径中。
clear
clc
pc=pcread('teapot.ply');
pc=pcRemoveDuplicate(pc);
pt=pc.Location;
count=pc.Count;
%%
indices=cell(count,1);
dists=cell(count,1);
w=cell(count,1);
diff=cell(count,1);
a=cell(count,1);
a_sum=cell(count,1);
b=cell(count,1);
cov=cell(count,1);
e=cell(count,1);
%%
for i=1:count
point=pt(i,:);
[indices{i},dists{i}]=findNeighborsInRadius(pc,point,0.1);
a_sum{i}=zeros(3,3);
for j=2:length(dists{i})
w{i}(j-1)=1/dists{i}(j);
diff{i}(j-1,:)=point-pt(indices{i}(j),:);
a{i}{j-1}=w{i}(j-1)*diff{i}(j-1,:)'*diff{i}(j-1,:);
a_sum{i}=a_sum{i}+a{i}{j-1};
end
b{i}=sum(w{i});
cov{i}=a_sum{i}/b{i};
e{i}=eig(cov{i});
e{i}=sort(e{i},"descend");
end
%%
flag=zeros(count,1);
threshold=0.6;%0~1
for i=1:count
if (e{i}(2)/e{i}(1))<=threshold&&(e{i}(3)/e{i}(2))<=threshold
flag(i)=1;
end
end
ISSpt=pt(flag==1,:);
figure
pcshow(pc)
hold on
scatter3(ISSpt(:,1),ISSpt(:,2),ISSpt(:,3),36,'r','*')