如何在点云中更改平面的位置?

时间:2019-11-27 09:04:26

标签: matlab

我在一个文本文件中具有x,y,z坐标,从中我以圆柱的形式创建点云。我想插入一个平面,以便仅提取某些点(相交点云和平面),以便稍后进行评估。 我已经可以编写代码以沿z轴插入平面了。我使用发布在here上的代码作为基础,并对其进行了调整。 我现在的问题是飞机在我对数据感兴趣的地方没有与点云相交。我已经尝试过围绕z轴旋转点云,这改变了平面的位置,但是它也改变了点云的形状,因此不再看起来像圆柱体。 我现在的问题是,在不改变点云形状的情况下,可以以某种方式更改平面的位置吗? 那就是我正在使用的代码:

filename = 'C:\Users\file location\plane.txt';
fileID = fopen(filename, 'r');

%% Read text file as columns and convert cell array into a matrix
ptCloud = cell2mat(textscan(fileID, '%f%f%f','delimiter',',','collectoutput',1));
%Separate matrix into x,y,z
x = ptCloud(:,1);
y = ptCloud(:,2);
z = ptCloud(:,3);

%% Create the plane 
p0 = [0 0 0];
p1 = [0 max(y(:)) 0];
p2 = [0 0 max(z(:))];

 % normal vector of a plane
n = cross(p0-p1,p0-p2);
n = n/norm(n);

    % equation of a plane
    % a(x-x0) + b(y-y0) + c(z-z0) = 0
F = @(X,Y) -n(1)/n(3)*(X-p0(1)) - n(2)/n(3)*(Y-p0(2)) + p0(3);
[x0,y0] = meshgrid([min(z(:)) max(z(:))]);
z0 = F(x0,y0);
    % find distance to plane for each point
    % (using the same formula)
FDIST = @(X,Y,Z) sum(n.*(p0-[X Y Z]));
D = arrayfun(FDIST,x(:),y(:),z(:),'uni',false);
D1 = cell2mat(D);
mindist = 1;                          % minumum distance to plane
ind = abs(D1) < mindist;

mplot = @(p,s) plot3(p(1),p(2),p(3),s);
plot3(x(:),y(:),z(:),'.b')              % all data
hold on
plot3(x(ind),y(ind),z(ind),'or')        % points belong to plane
    % original points
mplot(p1,'^k')
mplot(p2,'^k')
mplot(p0,'^k')
surf(x0,y0,z0,'FaceAlpha',0.5);          % plane

xlabel('X(mm)')
ylabel('Y(mm)')
zlabel('Z(mm)')
title('Plane in point cloud')

hold off

axis equal

我已经尝试过这样做,使点云绕z轴旋转。

x = x*cos(theta) - y*sin(theta);
y = x*sin(theta) + y*cos(theta);
z = z;

为更好地理解,您可以在下图上看到当前带有平面的点云的外观。

point cloud with plane

0 个答案:

没有答案