【发布时间】:2021-05-01 14:43:48
【问题描述】:
我有很大的点云(每个点云有几百万个点)并且想要计算所有点的几何属性。为此,我需要计算特征值。我怎样才能尽快做到这一点?我的数据存储在 *.las 文件中,我使用包 lidR 将它们读入。我也使用这个包来计算点度量。根据this的帖子,我实现了这个版本:
# load data
cloud_raw <- readLAS(path_points)
# because eigen() is really slow, use C++
Rcpp::sourceCpp(code = "
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::vec eigen_values(arma::mat A) {
arma::mat coeff, score;
arma::vec latent;
arma::princomp(coeff, score, latent, A);
return(latent);
}")
metric_geometry_features <- function(x, y, z) {
xyz <- cbind(x, y, z)
cov_matrix <- cov(xyz)
eigen_matrix <- eigen_values(cov_matrix)
geometries = list(
planarity = (eigen_matrix[2] - eigen_matrix[3]) / eigen_matrix[1],
linearity = (eigen_matrix[1] - eigen_matrix[2]) / eigen_matrix[1]
)
return(geometries)
}
metrics <- point_metrics(cloud_raw, ~metric_geometry_features(X,Y,Z), k = 20)
但是,对于我的小型测试云来说,这仍然非常慢(1400 万点大约需要 15 分钟)。在计算时,它告诉 mit 它只使用一个线程,我不知道如何更改这一点,以及这是否会大大提高性能。无论如何,我不知道如何使这个过程更快。我知道必须有一种方法,因为当我使用“CloudCompare”软件时,处理速度要快得多,并且可以在几秒钟内完成。我还尝试使用来自 lidR 包的stdshapemetrics(),它使用了一个无法访问的函数fast_eigen_values()。这需要同样长的时间,并告诉我它只使用一个线程。
【问题讨论】:
标签: r point-clouds eigenvalue lidr