簡體   English   中英

使用 RANSAC 將平面擬合到 3D 點雲

[英]Fit a plane to 3D point cloud using RANSAC

我正在嘗試使用 scikit 中的 RANSAC 將飛機安裝到點雲上。

我無法理解如何去做,如何繪制我從ransac.predict獲得的平面。

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

from sklearn import datasets, linear_model

diabetes = datasets.load_diabetes()
X_train = diabetes.data[:-20, (0,1)]

y_train = diabetes.target[:-20]

ransac = linear_model.RANSACRegressor(
                                        linear_model.LinearRegression()
                                     )

ransac.fit(X_train, y_train)

fig = plt.figure()
plt.clf()

ax = Axes3D(fig)

ax.plot_surface([-5,5],[-5,5], ransac.predict(X_train))

我收到錯誤信息

ValueError: shape mismatch: objects cannot be broadcast to a single shape

在此示例中,您僅使用 2 個特征來擬合不是 PLANE 而是一條線。

這也可以從以下方面看出:

ransac.estimator_.coef_
array([266.63361536, -48.86064441])

包含您擁有的 2 個特征中的每一個的權重。


讓我們制作一個真正的 3D 案例:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

from sklearn import datasets, linear_model

diabetes = datasets.load_diabetes()
X_train = diabetes.data[:-20, (0,1,2)]

y_train = diabetes.target[:-20]

ransac = linear_model.RANSACRegressor(linear_model.LinearRegression())
ransac.fit(X_train, y_train)


# the plane equation
z = lambda x,y: (-ransac.estimator_.intercept_ - ransac.estimator_.coef_[0]*x - ransac.estimator_.coef_[1]*y) / ransac.estimator_.coef_[2]

tmp = np.linspace(-5,5,50)
x,y = np.meshgrid(tmp,tmp)

fig = plt.figure()
ax  = fig.add_subplot(111, projection='3d')
ax.plot3D(X_train[:,0], X_train[:,1], X_train[:,2], 'or')
ax.plot_surface(x, y, z(x,y))
ax.view_init(10, 60)
plt.show()

在此處輸入圖片說明

暫無
暫無

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

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