3d - 如果添加了平移,如何正确计算 3D Procrustes 问题中的旋转?
问题描述
我正在开发一个例程,该例程应该将感测的 3D 点云Q 与参考点云P最佳对齐。所涉及的变换包括旋转、平移和缩放(相似性)。有大量关于如何使用 SVD 计算转换的文献。我一直在关注这个:RJ Hanson 和 MJ Norris,“基于奇异值分解的测量分析”,SIAM 科学与统计计算杂志,第一卷。2,第 363-373 页,1981 年。
描述的算法如下:计算每个点集中的质心,计算中心点集;计算两个中心点集之间的协方差矩阵并对协方差矩阵执行 SVD:C = U * S * V',其中C是协方差矩阵,S是其奇异值的对角矩阵,U和V是左侧和右奇异向量矩阵,分别。然后,您可以将变换的旋转分量计算为R = U' * V。
如果转换由旋转和(可选)缩放组成,则该算法对我非常有效,但如果存在平移,则它会失败。到目前为止,我还不明白我做错了什么。我也没有找到任何有用的数字示例,包括翻译并导致成功。
如果有人想看看,我也会上传我的代码。
解决方案
正如 Mauricio Cele Lopez Belon 正确推测的那样,这是一个错误,而是一个思维错误。每当您在相似变换中进行非单位缩放时,要计算平移向量,您需要使用与缩放相乘的旋转矩阵: t = qC - s * R * pC,其中pC和qC是参考的质心和感测点分别设置,R计算的纯旋转矩阵,s缩放。您需要使用此等式而不是t = qC - R * pC(您经常在论文中找到),以获得正确的结果。如果有人对工作和单元测试的 C# 代码感兴趣,我会很高兴发送(这个地方有点太长了)。
推荐阅读
- rx-java2 - rxjava - 如何从两个可观察对象中获取交替发射
- javascript - 按多个条件排序
- c# - 转换 AppointmentItem 的 HexEntryID 返回 EwsId,它不等于 Appointment 对象的 UniqueId
- arangodb - arangodb 能处理 200 亿条记录吗?
- python - 将包含矩阵对角线以下元素的列表转换为完整矩阵
- permissions - 通话记录和短信权限。此政策将影响您的一个或多个应用。
- nginx - 连接到上游(nginx + uwsgi)时连接被拒绝 - 集群
- javascript - Vuex - 基于模块状态的计算属性不会在调度时更新?
- c# - 马拉地语列数据翻译成英文
- r - 达到最小总和所需的列数,按行