open3D采用最小二乘法计算平面点云粗糙度,这个基准平面为什么,离点云那么远,不应该是根据点云拟合出来的吗,这样计算出来粗糙度值就很大,请问如何修改?
import open3d as o3d
import matplotlib.pyplot as plt
from numpy import *
import numpy as np
def roughness_projection(point_list, plane_list):
sa_list = []
for i in range(len(plane_list)):
A, B, C, D = plane_list[i]
f_a, f_b, f_c, f_d = -A, -B, -C, -D
x = point_list[i][:, 0]
y = point_list[i][:, 1]
z = point_list[i][:, 2]
distance = []
xp = []
yp = []
zp = []
for j in range(len(x)):
xp.append(
((f_b ** 2 + f_c ** 2) * x[j] - f_a * (f_b * y[j] + f_c * z[j] + f_d)) / (
f_a ** 2 + f_b ** 2 + f_c ** 2))
yp.append(
((f_a ** 2 + f_c ** 2) * y[j] - f_b * (f_a * x[j] + f_c * z[j] + f_d)) / (
f_a ** 2 + f_b ** 2 + f_c ** 2))
zp.append(
((f_a ** 2 + f_b ** 2) * z[j] - f_c * (f_a * x[j] + f_b * y[j] + f_d)) / (
f_a ** 2 + f_b ** 2 + f_c ** 2))
distance.append(((x[j] - xp[j]) ** 2 + (y[j] - yp[j]) ** 2 + (z[j] - zp[j]) ** 2) ** (0.5))
sa = mean(distance)
sa_list.append(sa)
return sa_list
def roughness_view(point_list, plane_list):
fig1 = plt.figure()
ax1 = fig1.add_subplot(111, projection='3d')
ax1.set_xlabel("x")
ax1.set_ylabel("y")
ax1.set_zlabel("z")
for i in range(len(plane_list)):
x = point_list[i][:, 0]
y = point_list[i][:, 1]
z = point_list[i][:, 2]
A, B, C, D = plane_list[i]
a, b, c, d = A, B, -C, D
ax1.scatter(x, y, z, color='gray', marker='.')
x_p = np.linspace(min(x), max(x), 100)
y_p = np.linspace(min(y), max(y), 100)
x_p, y_p = np.meshgrid(x_p, y_p)
z_p = a * x_p + b * y_p + d
ax1.plot_wireframe(x_p, y_p, z_p, rstride=10, cstride=10)
plt.show()
return None
if __name__ == '__main__':
# 拟合平面:z = 0.559 * x + 0.164 * y + -11.822
plane_list = [[0.559, 0.164, -1, -11.822]]
point_list = []
pcd = o3d.io.read_point_cloud("2.pcd")
pcd = np.asarray(pcd.points)
point_list.append(pcd)
sa_list = roughness_projection(point_list, plane_list)
print("sa算术平均粗糙度:", sa_list)
roughness_view(point_list, plane_list)
