簡體   English   中英

如何將平面擬合到 3D 點雲?

[英]How to fit a plane to a 3D point cloud?

我想將平面擬合到 3D 點雲。 我使用 RANSAC 方法,從點雲中采樣幾個點,計算平面,並存儲誤差最小的平面。 誤差是點和平面之間的距離。 我想使用 Eigen 在 C++ 中執行此操作。

到目前為止,我從點雲中采樣點並將數據居中。 現在,我需要將平面擬合到樣本點。 我知道我需要解決Mx = 0 ,但我該怎么做呢? 到目前為止,我有 M(我的樣本),我想知道 x(平面),並且這個擬合需要盡可能接近 0。

我不知道從哪里繼續。 我所擁有的只是我的采樣點,我需要更多數據。

根據您的問題,我假設您熟悉 Ransac 算法,因此我將免除您冗長的討論。

第一步,您對三個隨機點進行采樣。 您可以為此使用Random類,但選擇它們不是真正隨機的通常會產生更好的結果。 對於這些點,您可以簡單地使用Hyperplane::Through擬合平面。

在第二步中,您重復地用大的Hyperplane::absDistance 划掉一些點,並對剩余的點執行最小二乘擬合。 它可能看起來像這樣:

Vector3f mu = mean(points);
Matrix3f covar = covariance(points, mu);
Vector3 normal = smallest_eigenvector(covar);
JacobiSVD<Matrix3f> svd(covariance, ComputeFullU);
Vector3f normal = svd.matrixU().col(2);
Hyperplane<float, 3> result(normal, mu);

不幸的是, meancovariance函數不是內置的,但它們的編碼相當簡單。

回想一下,通過原點的平面的方程是 Ax + By + Cz = 0,其中 (x, y, z) 可以是平面上的任意點,而 (A, B, C) 是垂直於該平面的法向量.

一般平面(可能通過也可能不通過原點)的方程為 Ax + By + Cz + D = 0,其中附加系數 D 表示平面沿法線向量方向距原點的距離飛機的。 [請注意,在這個方程中 (A, B, C) 形成一個單位法向量。]

現在,我們可以在這里應用一個技巧,只使用提供的點坐標來擬合平面。 將兩邊除以 D 並將此項重新排列到右側。 這導致 A/D x + B/D y + C/D z = -1。 [請注意,在這個方程中 (A/D, B/D, C/D) 形成一個長度為 1/D 的法向量。]

我們可以相應地建立一個線性方程組,然后通過 Eigen 求解器對其進行求解,如下所示。

// Example for 5 points
Eigen::Matrix<double, 5, 3> matA; // row: 5 points; column: xyz coordinates
Eigen::Matrix<double, 5, 1> matB = -1 * Eigen::Matrix<double, 5, 1>::Ones();

// Find the plane normal
Eigen::Vector3d normal = matA.colPivHouseholderQr().solve(matB);

// Check if the fitting is healthy
double D = 1 / normal.norm();
normal.normalize(); // normal is a unit vector from now on
bool planeValid = true;
for (int i = 0; i < 5; ++i) { // compare Ax + By + Cz + D with 0.2 (ideally Ax + By + Cz + D = 0)
  if ( fabs( normal(0)*matA(i, 0) + normal(1)*matA(i, 1) + normal(2)*matA(i, 2) + D) > 0.2) {
    planeValid = false; // 0.2 is an experimental threshold; can be tuned
    break;
  }
}

這種方法相當於典型的基於 SVD 的方法,但要快得多。 它適用於已知點大致呈平面形狀時使用。 然而,基於 SVD 的方法在數值上更穩定(當平面遠離原點時)並且對異常值具有魯棒性。

暫無
暫無

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

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