我试图使用回归公式Z = a X + b Y + C在三维点云中找到平面
我实现最小二乘和RANSAC的解决方案,但3个参数方程限制平面拟合到2.5D-式不能在平面上施加平行于Z轴.
我的问题是如何将平面拟合推广到完整的3d?我想添加第四个参数以获得完整的方程式X + b Y + c*Z + d如何避免平凡的(0,0,0,0)解?
谢谢!
我正在使用的代码:
from sklearn import linear_model
def local_regression_plane_ransac(neighborhood):
"""
Computes parameters for a local regression plane using RANSAC
"""
XY = neighborhood[:,:2]
Z = neighborhood[:,2]
ransac = linear_model.RANSACRegressor(
linear_model.LinearRegression(),
residual_threshold=0.1
)
ransac.fit(XY, Z)
inlier_mask = ransac.inlier_mask_
coeff = model_ransac.estimator_.coef_
intercept = model_ransac.estimator_.intercept_
Run Code Online (Sandbox Code Playgroud) 我希望将飞机安装到一组约6-10k的3D点上.我希望尽可能快地做到这一点,并且准确性不是最关心的问题(坦白地说,飞机可以在任何主轴上偏离+ -10度).
我目前的方法是使用最好的最佳拟合,但速度非常慢(我希望每次运行算法时以大约10-50k的速度提取平面,并且按照这个速率,它将在几周内完成,如同反对小时)因为它适用于所有可能的6000点组合,所以~35,000,000,000次迭代,坦率地说它具有比我需要的更高的准确度.
有没有人知道任何较弱的平面拟合技术可能会大大提高我的算法速度?
编辑:
通过在每个可能的3D角度(每次踩到5度)创建平面并测试现有点以找到最佳平面,而不是将平面安装到平面,我设法将迭代次数降低到〜42k.我有点.
我确信在这里可以通过分裂和征服获得一些东西,虽然我担心我可以直接跳过最好的飞机.
我有一套点云,我想测试3D房间是否有角落.所以我想讨论我的方法,如果在速度方面有更好的方法,因为我想在手机上测试它.
我将尝试使用hough tranform来检测线条,然后我将尝试查看是否有三条相交的线条,它们也构成了一条相交的两个平面.
我有我的3D数据X,Y,Z(大小为NxM的矩阵)
我想把它装到我做过的最合适的飞机上:
X = X(isfinite(X));% deleting the NaN because svd Doesn't accept them
Y = Y(isfinite(Y));
Z = Z(isfinite(Z));
G = [X,Y,Z,ones(size(X(:)))];
[u s v] = svd(G,0);
P = v(:,4);
scalar = 2*P./P(1);
P = P./scalar; % supposed to be my plane equation but there is something wrong
Run Code Online (Sandbox Code Playgroud)
然后从X和Y重新计算Z.
Z = -(P(1)*X + P(2)*Y + P(4)) / P(3);
Run Code Online (Sandbox Code Playgroud)
我不知道是什么问题!!