计算和绘制两点云之间的差异

问题描述 投票:2回答:2

我有两个不同尺寸的点云(XYZ坐标),希望能够计算它们之间的差异(结果是XYZ数组,Z是它们之间的距离),然后将它们作为表面绘制在一起区别在于不同的颜色。

此问题似乎相关,但与我要查找的内容不完全相同:Subtract two trisurf plots from one another

这里是一些示例数据和代码。我不知道如何将一个数据集插值到另一个数据集。

%Point Cloud 1
X1 = randn(100,1);
Y1 = randn(100,1);
Z1 =(exp(-X1.^2-Y1.^2));
% Point Cloud 2
X2 = randn(107,1);
Y2 = randn(107,1);
Z2 = (exp(-X2.^2-Y2.^2));

tri1 = delaunay(X1, Y1);
tri2 = delaunay(X2, Y2);

trisurf(tri1, X1, Y1, Z1, 1)
hold on
trisurf(tri2, X2, Y2, Z2, 100)
hold off

我上面提到的问题直接指向此处:How Do I Generate a 3-D Surface From Isolines?,但是我对Matlab中3d数据插值并不陌生,似乎无法弄清楚。任何帮助,将不胜感激。谢谢。

matlab interpolation point-clouds
2个回答
3
投票

我认为这会有所帮助,实际上只是您没有的插值方法。

%Point Cloud 1
X1 = randn(100,1);
Y1 = randn(100,1);
Z1 =(exp(-X1.^2-Y1.^2));
% Point Cloud 2
X2 = randn(107,1);
Y2 = randn(107,1);
Z2 = (exp(-X2.^2-Y2.^2));

% Mesh for interpolation
x=linspace(min([X1;X2]),max([X1;X2]),40);
y=linspace(min([Y1;Y2]),max([Y1;Y2]),40);
[X,Y]=meshgrid(x,y);

% Calculate interpolants
V1=TriScatteredInterp(X1,Y1,Z1);
V2=TriScatteredInterp(X2,Y2,Z2);
F1=V1(X,Y);
F2=V2(X,Y);

% Plot to check results!
figure(1)
scatter3(X1,Y1,Z1)
hold on
mesh(X,Y,F1)
hold off
figure(2)
scatter3(X2,Y2,Z2)
hold on
mesh(X,Y,F2)
hold off

您也可以使用griddata

% Calculate interpolants
F1=griddata(X1,Y1,Z1,X,Y);
F2=griddata(X2,Y2,Z2,X,Y);

0
投票

我还想计算和绘制两个点云(M2C)之间的差异,但是我不知道为什么使用TriScatteredInterp方法?我真的不明白这里发生了什么。你能(大卫或博)请解释一下吗?我使用这种方法处理了点云。结果看起来不错,但是值不正确。差异大于真实差异。我将您的结果和代码发送给您,并要求提供帮助。对于想法,建议或纠正,我非常感谢。第一个使用Matlab,第二个使用CloudCompare生成(正确的一个)。enter image description hereenter image description here

% Matlab Code
close all;clear all;
%Point Cloud 1
data2=importdata('ST2_2_161019_segmented.txt');                % Referenz (mesh)
data1=importdata('labor16_10_19 - segmented.txt');
X1 = data1(:,1);
Y1 = data1(:,2);
Z1 = data1(:,3);
% Point Cloud 2
X2 = data2(:,1);
Y2 = data2(:,2);
Z2 = data2(:,3);
 
% Mesh for interpolation
x=linspace(min([X1;X2]),max([X1;X2]),2000);
y=linspace(min([Y1;Y2]),max([Y1;Y2]),2000);
z=linspace(min([Z1;Z2]),max([Z1;Z2]),2000);
[X,Z]=meshgrid(x,z);
[X,Y]=meshgrid(x,y);

% Calculate interpolants
% F.Method = 'natural';
% F.Method = 'nearest';
V1=scatteredInterpolant(X1,Z1,Y1);
V2=scatteredInterpolant(X2,Z2,Y2);
F1=V1(X,Z);
F2=V2(X,Z);

figure(1);

% scatter3(X2,Z2,Y2)
hold on
mesh(X,Z,Y,F2-F1);
colormap(jet);
colormap(jet); h=colorbar; %set(h,'YTick',-0.10:0.02:0.2);
xlabel('X (m)')
ylabel('Y (m)')
zlabel('Z (m)')
hold off 
© www.soinside.com 2019 - 2024. All rights reserved.