定义三维空间中变换估计的准确性

时间:2018-03-11 04:21:02

标签: python c++ machine-learning point-cloud-library

我正在使用Umeyama's SVD method来估计两个三维点集之间的刚性变换。请参阅下面的代码段 -

Eigen::Matrix4f T_svd;
const pcl::registration::TransformationEstimationSVD<pcl::PointXYZ, pcl::PointXYZ> trans_est_svd;
trans_est_svd.estimateRigidTransformation(source, target, T_svd);

稍后,使用上面估计的变换矩阵

转换源点集
pcl::PointCloud<pcl::PointXYZ> target_est;
pcl::transformPointCloud(source, target_est, T_svd);

为了计算上述转换估算的准确性,我正在进行此操作:

import numpy as np

# target and target_est clouds were saved as csv
y = np.loadtxt(target, delimiter=',')
y_est = np.loadtxt(target_est, delimiter=',')

y_est = np.sqrt(np.sum((y_est)**2, axis=1))
y_sum = np.sqrt(np.sum((y)**2, axis=1))

acc = y_est/y_sum
mean_acc = acc.mean()

上面代码的平均准确度显示为1.0001,这让我怀疑我的方法。

我想知道如何定义三维空间中变换估计的准确性。

1 个答案:

答案 0 :(得分:1)

提供我在pcl用户论坛上已经给出的答案的更多见解。

看看Hinsterstoisser等人的Model Based Training, Detection and Pose Estimation of Texture-Less 3D Objects in Heavily Cluttered Scenes的等式1和2。俗称LineMOD。这是用于刚性物体的姿势估计问题的常用方法。

等式1用于非对称对象,2用于对称对象。我无法输入表达式,因为Stack Overflow不支持mathjax,但一般的想法是:

  1. 估计您的点的位置与实际位置之间差异的标准,对所有点求和,并按点数归一化
  2. 第一个的区别在于您不再强制执行点对应。来自源云的每个点,选择目标云上的最近点。然后像以前那样执行求和和平均。
  3. 这不是一个堆栈溢出问题,它是一个数学交换问题。