先上代码
Eigen::Matrix3d cov_m = Eigen::Matrix3d::Zero ();
getScatterMatrix (static_cast<int> (index), cov_m);
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> solver (cov_m);
pcl::ISSKeypoint3D<PointInT, PointOutT, NormalT>::getScatterMatrix (const int& current_index, Eigen::Matrix3d &cov_m)
{
const PointInT& current_point = (*input_).points[current_index];
double central_point[3];
memset(central_point, 0, sizeof(double) * 3);
central_point[0] = current_point.x;
central_point[1] = current_point.y;
central_point[2] = current_point.z;
cov_m = Eigen::Matrix3d::Zero ();
std::vector<int> nn_indices;
std::vector<float> nn_distances;
int n_neighbors;
this->searchForNeighbors (current_index, salient_radius_, nn_indices, nn_distances);
n_neighbors = static_cast<int> (nn_indices.size ());
if (n_neighbors < min_neighbors_)
return;
double cov[9];
memset(cov, 0, sizeof(double) * 9);
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]);
}
cov_m << cov[0], cov[1], cov[2],
cov[3], cov[4], cov[5],
cov[6], cov[7], cov[8];
}
这里先看一下getScatterMatrix。从下图可以看出和iss论文中的有些不一样,weight不是取距离倒数,而是直接取1了,相当于没有weight。