使用MATLAB实现点云精简,实验数据采用斯坦福兔子点云模型(bun000.ply),欢迎各位批评指正。
主要步骤如下:
1、计算各点K近邻内曲率
2、设置阈值筛选特征点
数据下载地址如下:
链接:https://pan.baidu.com/s/17JSVD40pSt6eqMrqkUx8qA?pwd=4zvo
提取码:4zvo
--来自百度网盘超级会员V5的分享
clc;
clear;
pc = pcread('bun000.ply');
pt=double(pc.Location);
count=pc.Count;
x=pt(:,1);
y=pt(:,2);
z=pt(:,3);
%%
K=50;
Thres=0.01;
%%
curvature=pccurvature(pc,K);
flag = zeros(count,1);
for i = 1:count
if curvature(i)>Thres
flag(i)=1;
end
end
fprintf('精简比例为%d%%\n',round(100*length(find(flag==1))/count));
edge=boundary(x,y);
flag(edge,:)=1;
pt1=pt(flag==1,:);
%% 曲率精简
figure
pcshow(pt,"blue",viewPlane="XY",MarkerSize=5,BackgroundColor=[1 1 1],AxesVisibility=0)
img=gcf;
print(img, '-dpng', '-r300', ...
'C:\Users\11607\Desktop\论文插图\曲率1.jpg')
figure
pcshow(pt1,"blue",ViewPlane="XY",MarkerSize=40,BackgroundColor=[1 1 1],AxesVisibility=0)
img=gcf;
print(img, '-dpng', '-r300', ...
'C:\Users\11607\Desktop\论文插图\曲率2.jpg')
figure
pcshow(pt,curvature,ViewPlane="XY",MarkerSize=40,BackgroundColor=[1 1 1],AxesVisibility=0)
colormap sky
colorbar
img=gcf;
print(img, '-dpng', '-r300', ...
'C:\Users\11607\Desktop\论文插图\曲率3.jpg')
function curvature=pccurvature(pc,K)
count=pc.Count;
pt=pc.Location;
curvature = zeros(count,1);
for i = 1:count
point=pt(i,:);
[indices,~] = findNearestNeighbors(pc,point,K,'sort',true);
KNNpoints=pt(indices,:);
centroid = mean(KNNpoints,1);
deMean = bsxfun(@minus,KNNpoints,centroid);
H = 1/size(KNNpoints,1)*(deMean'*deMean);
S = svd(H);%特征值
curvature(i) = S(3)/sum(S);
fprintf('%d\n',i)
end
clc
end