I have my 3D points(lidar data) as a text file. can anyone suggest me a method for fitting the plane.

 採用された回答

Star Strider
Star Strider 2019 年 3 月 26 日

0 投票

Try this:
P = bsxfun(@times, rand(49, 3), [1 10 100]); % Create Matrix [x, y, z]
B = [P(:,1), P(:,2), ones(size(P,1),1)] \ P(:,3); % Linear Regression
xv = [min(P(:,1)) max(P(:,1))];
yv = [min(P(:,2)) max(P(:,2))];
zv = [xv(:), yv(:), ones(2,1)] * B; % Calculate Regression Plane
figure
stem3(P(:,1), P(:,2), P(:,3), '.')
hold on
patch([min(xv) min(xv) max(xv) max(xv)], [min(yv) max(yv) max(yv) min(yv)], [min(zv) min(zv) max(zv) max(zv)], 'r', 'FaceAlpha',0.5)
hold off
grid on
xlabel('X')
ylabel('Y')
producing (with this set of random data):
Plane fitting using 3D points - 2019 03 26.png

7 件のコメント

Ashicka Banu Mubarak
Ashicka Banu Mubarak 2019 年 3 月 26 日
Hello star strider,
I already have 3D points and I'm need of a multiple planes for those points and not a single plane considering all the points. Can you suggest me any codes sir?
Star Strider
Star Strider 2019 年 3 月 26 日
I have no idea what you are asking.
If you have multiple sets of points ((Nx3) matrices), use my code for each set.
Ashicka Banu Mubarak
Ashicka Banu Mubarak 2019 年 3 月 27 日
I'm doing research on 'Automated Building Extraction'. I have 3D point data for an urban region with no vegetation and ground points. Now the points I have is mostly on building roof. To extract each building roof separately, I need to fit separate planes on each building roof with the points that lie on the respective roofs. Since the points on each roof will be planar. I hope you understood my query. Can you help me to find a solution sir? Looking forward for your help sir.
Star Strider
Star Strider 2019 年 3 月 27 日
Just use my code with the roof coordinates instead of the random data.
It will be best to do each plane of each roof separately.
Ashicka Banu Mubarak
Ashicka Banu Mubarak 2019 年 3 月 28 日
lidarFile = '/Users/Ashi/Downloads/las_data/Subset/LIDAR_subset.txt';
fp = fopen(lidarFile, 'r');
ALS = fscanf(fp, '%f %f %f', [3 inf]);
fclose(fp);
ALS = ALS';
x=ALS(:,1);
y=ALS(:,2);
z =ALS(:,3);
% Create Matrix [x, y, z]
B = [ALS(:,1), ALS(:,2), ones(size(ALS,1),1)] \ ALS(:,3); % Linear Regression
xv = [min(ALS(:,1)) max(ALS(:,1))];
yv = [min(ALS(:,2)) max(ALS(:,2))];
zv = [xv(:), yv(:), ones(2,1)] * B; % Calculate Regression Plane
figure
stem3(ALS(:,1), ALS(:,2), ALS(:,3), '.')
hold on
patch([min(xv) min(xv) max(xv) max(xv)], [min(yv) max(yv) max(yv) min(yv)], [min(zv) min(zv) max(zv) max(zv)], 'r', 'FaceAlpha',0.5)
hold off
grid on
xlabel('X')
ylabel('Y')
This is the code I'm using for my points. I have included my result image and the points I'm using and the original orthoimage.
Ashicka Banu Mubarak
Ashicka Banu Mubarak 2019 年 3 月 28 日
Orthoimage
VIGNESH BALAJI
VIGNESH BALAJI 2023 年 7 月 21 日
@Star Strider When I use your method, the plane fit for a 3D dataset is not a good fit, maybe because instead of regression you can calculate mean of the points and find a basis of the plane and fit the plane to the data.
When I used Plane Fit (Affine fit function to fit the data) https://nl.mathworks.com/matlabcentral/fileexchange/43305-plane-fit . I got a better fit

サインインしてコメントする。

その他の回答 (0 件)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by