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

16 ビュー (過去 30 日間)
H.O
H.O 2023 年 10 月 15 日
編集済み: H.O 2023 年 10 月 18 日
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 日
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 件)

カテゴリ

Help Center および File ExchangeStatistics and Machine Learning Toolbox 入門 についてさらに検索

Community Treasure Hunt

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

Start Hunting!