3次元点群の法線ベクトルをもとめる

23 views (last 30 days)
H.O
H.O on 15 Oct 2023
Edited: H.O on 18 Oct 2023
3次元点群の任意点(point)に対して
・法線ベクトルとその単位ベクトルを求めたいです
・求めた近似平面と法線ベクトルを可視化(グラフ表示)したいです
どのようにするとよろしいでしょうか
%任意点とその半径から捜査範囲を設定
ptCloud=pcread('airplane.ply');%サンプルデータ参照元https://people.sc.fsu.edu/~jburkardt/data/ply/ply.html
point = [901.47 34.53 64.99]; radius = 10;
[indices,dists] = findNeighborsInRadius(ptCloud,point,radius);
ptCloudB = select(ptCloud,indices);
X=ptCloudB.Location;
%参考:主成分分析を使用した直交回帰の近似 - MATLAB & Simulink Example - MathWorks 日本
[coeff,score,roots] = pca(X);
normal = coeff(:,3) %近似平面の法線ベクトル
%%以降に可視化するコードを書きたい

Accepted Answer

Tohru Kikawada
Tohru Kikawada on 16 Oct 2023
Edited: Tohru Kikawada on 16 Oct 2023
pcnormalsで実現するのはいかがでしょうか。
websave("airplane.ply","https://people.sc.fsu.edu/~jburkardt/data/ply/airplane.ply");
ans = '/users/mss.system.mOV4N3/airplane.ply'
ptCloud=pcread('airplane.ply');
normals = pcnormals(ptCloud);
figure
pcshow(ptCloud)
title('Estimated Normals of Point Cloud')
hold on
% Figure contains an axes object. The axes object with title Estimated Normals of Point Cloud contains an object of type scatter.
x = ptCloud.Location(1:10:end,1);
y = ptCloud.Location(1:10:end,2);
z = ptCloud.Location(1:10:end,3);
u = normals(1:10:end,1);
v = normals(1:10:end,2);
w = normals(1:10:end,3);
% 法線ベクトルをプロットします。
quiver3(x,y,z,u,v,w);
  1 Comment
H.O
H.O on 18 Oct 2023
Edited: H.O on 18 Oct 2023
ありがとうございます.参照させていただきます.
また,法線ベクトルを指定した点群の範囲につき1つに定義したく,
例えばPCAで求まる近似平面など から法線ベクトル1つを計算できればと考えています.

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!