admin 管理员组

文章数量: 1184232

iss

iss 也是一种点云的特征点,其主要是依赖周边的领域而设置的;本文将结合 pcl 的源码 来说明。

先计算 领域的协方差矩阵 Iss 论文涉及到了 权重 但是pcl 中没有哦。

  for (int n_idx = 0; n_idx < n_neighbors; n_idx++){const PointInT& n_point = (*input_).points[nn_indices[n_idx]];double neigh_point[3];memset(neigh_point, 0, sizeof(double) * 3);neigh_point[0] = n_point.x;neigh_point[1] = n_point.y;neigh_point[2] = n_point.z;for (int i = 0; i < 3; i++)for (int j = 0; j < 3; j++)cov[i * 3 + j] += (neigh_point[i] - central_point[i]) * (neigh_point[j] - central_point[j]);}

求解特征值:

      getScatterMatrix (static_cast<int> (index), cov_m);Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> solver (cov_m);const double& e1c = solver.eigenvalues ()[2];const double& e2c = solver.eigenvalues ()[1];const double& e3c = solver.eigenvalues ()[0];

判断因子:

      omp_mem[tid][0] = e2c / e1c;omp_mem[tid][1] = e3c / e2c;;omp_mem[tid][2] = e3c;

最后还有一个非极大值抑制的操作:

  for (index = 0; index < int (input_->size ()); index++){feat_max [index] = false;PointInT current_point = input_->points[index];if ((third_eigen_value_[index] > 0.0) && (pcl::isFinite(current_point))){std::vector<int> nn_indices;std::vector<float> nn_distances;int n_neighbors;this->searchForNeighbors (static_cast<int> (index), non_max_radius_, nn_indices, nn_distances);n_neighbors = static_cast<int> (nn_indices.size ());if (n_neighbors >= min_neighbors_){is_max = true;for (int j = 0 ; j < n_neighbors; j++)if (third_eigen_value_[index] < third_eigen_value_[nn_indices[j]])is_max = false;if (is_max)feat_max[index] = true;}}}

 

本文标签: iss