我正在使用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,这让我怀疑我的方法。
我想知道如何定义三维空间中变换估计的准确性。
答案 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,但一般的想法是:
这不是一个堆栈溢出问题,它是一个数学交换问题。