Похоже, что функция EstimateNormals
не работает должным образом для полностью плоских участков, также как-то в зависимости от ориентации.
Воспроизвести:
import numpy as np
import open3d
X,Y = np.mgrid[0:1:0.1,0:1:0.1]
X = X.flatten()
Y = Y.flatten()
pts = np.zeros((3, X.size))
pts[0] = X
pts[1] = Y
shape = open3d.PointCloud()
shape.points = open3d.Vector3dVector(pts.T)
shape.paint_uniform_color([0, 0.651, 0.929]) # blue
open3d.estimate_normals(shape, open3d.KDTreeSearchParamHybrid(radius = 0.5, max_nn = 30))
# show the shape
open3d.draw_geometries([shape])
Если вы напишете
pts[1] = X
pts[2] = Y
вместо этого - работает как положено; если вы используете в качестве индексов 0 и 1 или 0 и 2 - это больше не работает.
Ожидал:
Получил:
Окружающая среда (просьба заполнить следующую информацию):
Хороший улов. Похоже на числовую проблему этой функции:
https://github.com/IntelVCL/Open3D/blob/377fc7d6a47ea47681c25a1e07a5383d62a612aa/src/Open3D/Geometry/EstimateNormals.cpp#L40
Я раскопаюсь, когда у меня будет время.
Интересный факт: добавление минимального шума к точкам решает проблему.
Исправлено в # 1011