“R:计算激光雷达点云的稳健法线并跟踪有效指标”

问题描述 投票:0回答:0

我正在 R 中处理 LiDAR 点云数据,并尝试使用基于局部平面的方法计算点的稳健法线。我的目标是计算点云中每个点的法线,并跟踪已成功计算法线的有效索引。

我编写了一个名为 robust_normals 的函数来执行此任务,它使用 RANN 包在每个点周围的搜索半径内查找邻居。然后,它使用中心相邻点的协方差矩阵的特征分解来计算法向量。

问题是当我运行这个函数时,它没有返回计算法线的正确有效索引列表。这是我的 robust_normals 函数的当前实现:

robust_normals <- function(pts, search_radius = 10) {
  kdtree <- RANN::nn2(pts, query = pts, treetype = "kd", searchtype = "radius", radius = search_radius)
  normals <- matrix(NA, nrow = nrow(pts), ncol = 3)
  valid_indices <- list()
  
  for (i in 1:nrow(pts)) {
    neighbors <- pts[kdtree$nn.idx[[i]], , drop = FALSE]
    
    if (nrow(neighbors) < 2) {
      cat("Not enough neighbors for point", i, "\n")
      next
    }
    
    centered_neighbors <- scale(neighbors, scale = FALSE, center = pts[i, ])
    cov_matrix <- cov(centered_neighbors)
    
    if (any(is.infinite(cov_matrix)) || any(is.na(cov_matrix))) {
      cat("Invalid covariance matrix for point", i, "\n")
      next
    }
    
    eigen_decomp <- eigen(cov_matrix)
    normals[i, ] <- eigen_decomp$vectors[, 3]
    valid_indices[[length(valid_indices) + 1]] <- i
  }
  
  return(list(normals = normals, valid_indices = valid_indices))
}

valid_indices 列表结果为空 (NULL),即使法线已成功计算的地方应该有有效索引。我不确定为什么会这样。有人可以帮助我确定我的实施问题或建议一种替代方法来计算稳健法线并跟踪有效索引吗?

r point-clouds eigenvector normals lidar
© www.soinside.com 2019 - 2024. All rights reserved.