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

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) %近似平面の法線ベクトル
%%以降に可視化するコードを書きたい

 採用された回答

Tohru Kikawada
Tohru Kikawada 2023 年 10 月 16 日
編集済み: Tohru Kikawada 2023 年 10 月 16 日

1 投票

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 件のコメント

H.O
H.O 2023 年 10 月 18 日
編集済み: H.O 2023 年 10 月 18 日
ありがとうございます.参照させていただきます.
また,法線ベクトルを指定した点群の範囲につき1つに定義したく,
例えばPCAで求まる近似平面など から法線ベクトル1つを計算できればと考えています.

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

その他の回答 (0 件)

カテゴリ

質問済み:

H.O
2023 年 10 月 15 日

編集済み:

H.O
2023 年 10 月 18 日

Community Treasure Hunt

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

Start Hunting!