簡體   English   中英

在 MATLab 中計算 3d 點法線

[英]Calculating 3d Point Normals in MATLab

我在 MATLab 中有一個 3d 點的點雲。 點雲采用 3xN 矩陣的形式。

我想以 3xN 矩陣的形式計算每個點的法線。 我該怎么做呢?

到目前為止,我已經嘗試使用

nX = (surfnorm(X'))';

其中 X 是我的點雲,而 nX 應該是我返回的法線。 但是,每當我嘗試以這種方式進行渲染時,它似乎都不起作用……這是正確的方法嗎?

提前致謝!

surfnorm需要一個表面,因此它將點位置的 3 x N 矩陣作為 3 x N 大小的表面(調用surfnorm ,輸入將 Z、X 和 Y 設置為默認值)。 我看不到任何直接在點雲上使用此功能的方法。

為了從點雲中找到法線,您需要:

1)從您的點雲中擬合某種表面,然后在其上使用surfnorm 2)估計每個點的法線,使用周圍的點。 這個網站提供了一個很好的概述。

文件交換上實際上有一個文件,它演示了從給定的一組點(來自一組給定的點的單個法線)計算法線。 您需要做的是為每個點計算一組最近的鄰居,然后返回法向量。 您可能還需要更正向量的方向。

由於您擁有 3 x N 點雲,因此假設它的名稱為mat 那么我建議采取以下方法:

% Constructing the Point Cloud and Data Structure
ptCloud = pointCloud(mat);

% Normal Esitmation (3 is simply tthe number of points used for local plane fitting)
normals = pcnormals(ptCloud,3);

此時,您的法線以 (3N) x 3 矩陣的形式計算。 您可以通過以下方式將其添加為點雲的屬性

ptCloud.Normal = normals;

為了可視化它,可以執行以下操作:

step_size = 10; 

x = ptCloud.Location(1:step_size:end,1);
y = ptCloud.Location(1:step_size:end,2);
z = ptCloud.Location(1:step_size:end,3);
u = ptCloud.Normal(1:step_size:end,1);
v = ptCloud.Normal(1:step_size:end,2);
w = ptCloud.Normal(1:step_size:end,3);

% plot

figure;
hold on

% plot the point cloud
pcshow(ptCloud);

% plot the normal arrows
quiver3(x,y,z,u,v,w);

hold off

最后一條評論:與簡單地繪制點矩陣相比,通過pointCloud函數創建點雲提供了更加優化的可視化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM