pcl中iss关键点代码分析1

这段代码展示了如何使用Eigen库在PCL(Point Cloud Library)中计算点云数据的散射矩阵。getScatterMatrix函数首先初始化为零的协方差矩阵,并通过遍历点云的邻域来填充它。每个邻域点与中心点的差值平方被累加到协方差矩阵中,但与论文中提到的权重不同,这里没有使用距离倒数作为权重,而是简单地将权重设为1。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先上代码

      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。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值