bool PointCloud::EstimateNormals(
const KDTreeSearchParam &search_param /* = KDTreeSearchParamKNN()*/,
bool fast_normal_computation /* = true */) {
bool has_normal = HasNormals();
if (HasNormals() == false) {
normals_.resize(points_.size());
}
KDTreeFlann kdtree;
kdtree.SetGeometry(*this);
#ifdef _OPENMP
#pragma omp parallel for schedule(static)
#endif
for (int i = 0; i < (int)points_.size(); i++) {
std::vector<int> indices;
std::vector<double> distance2;
Eigen::Vector3d normal;
if (kdtree.Search(points_[i], search_param, indices, distance2) >= 3) {
normal = ComputeNormal(*this, indices, fast_normal_computation);
if (normal.norm() == 0.0) {
if (has_normal) {
normal = normals_[i];
} else {
normal = Eigen::Vector3d(0.0, 0.0, 1.0);
}
}
if (has_normal && normal.dot(normals_[i]) < 0.0) {
normal *= -1.0;
}
normals_[i] = normal;
} else {
normals_[i] = Eigen::Vector3d(0.0, 0.0, 1.0);
}
}
return true;
}
这个函数就是计算点云法向量的
1。kdtreesearchparm 是用来搜索最近的点的
首先使用kdtree搜索每个点的最近点,如果大于3个,那么就求这最近点的协方差。也就是平面法向量
如果kdtree搜索最近的点小于3个 ,那么就默认是0,0,1