在两组对应的三维点数据之间寻找最佳的旋转和平移,使它们对齐/注册,是我遇到的一个常见问题。下面给出了3个对应点的最简单情况(需要解决的最小点)。

对应点的颜色相同,R是旋转,t是平移。我们想要找到将数据集A中的点与数据集b对齐的最佳旋转和平移。这种变换有时被称为欧几里德变换或刚性变换,因为它保持了形状和大小。这与仿射变换形成对比,仿射变换包括缩放和剪切。

我将给出的解决方案来自于Besl和McKay在1992年发表的论文:
“A Method for Registration of 3-D Shapes’, by Besl and McKay, 1992.”

解决方案概述

我们正在求解方程中的R,t:
B = R*A + t
其中R,t是应用于数据集A的变换,使其与数据集B尽可能对齐。求最优刚性变换矩阵可分解为以下步骤:
1.求两个数据集的质心
2.将两个数据集带到原点,然后求最优旋转(矩阵R)
3.求平移t

求质心

求质心这一点很简单,质心只是平均点,可以计算如下:

求最优旋转

有几种方法可以找到点之间的最佳旋转。我发现最简单的方法是使用奇异值分解(SVD),

为了找到最佳的旋转,我们首先将两个数据集重新居中,使两个中心点都位于原点,如下图所示。

H是协方差矩阵。

特殊情况

if determinant(R) < 0multiply 3rd column of V by -1recompute R
end ifAn alternative check that is possibly more robust was suggested by Nick Lambert, where R is the rotation matrix.if determinant(R) < 0multiply 3rd column of R by -1
end if

Matlab代码

% This function finds the optimal Rigid/Euclidean transform in 3D space
% It expects as input a Nx3 matrix of 3D points.
% It returns R, t% You can verify the correctness of the function by copying and pasting these commands:
%{R = orth(rand(3,3)); % random rotation matrixif det(R) < 0V(:,3) *= -1;R = V*U';
endt = rand(3,1); % random translationn = 10; % number of points
A = rand(n,3);
B = R*A' + repmat(t, 1, n);
B = B';[ret_R, ret_t] = rigid_transform_3D(A, B);A2 = (ret_R*A') + repmat(ret_t, 1, n)
A2 = A2'% Find the error
err = A2 - B;
err = err .* err;
err = sum(err(:));
rmse = sqrt(err/n);disp(sprintf("RMSE: %f", rmse));
disp("If RMSE is near zero, the function is correct!");%}% expects row data
function [R,t] = rigid_transform_3D(A, B)if nargin != 2error("Missing parameters");endassert(size(A) == size(B))centroid_A = mean(A);centroid_B = mean(B);N = size(A,1);H = (A - repmat(centroid_A, N, 1))' * (B - repmat(centroid_B, N, 1));[U,S,V] = svd(H);R = V*U';if det(R) < 0printf("Reflection detected\n");V(:,3) = -1*V(:,3);R = V*U';endt = -R*centroid_A' + centroid_B'
end

 centroid_A = mean(A);centroid_B = mean(B);N = size(A,1);H = (A - repmat(centroid_A, N, 1))' * (B - repmat(centroid_B, N, 1));A_move=A - repmat(centroid_A, N, 1);B_move=B - repmat(centroid_B, N, 1);A_norm=sum(A_move.*A_move,2);B_norm=sum(B_move.*B_move,2);%计算尺度平均值lam2=A_norm./B_norm;lam2=mean(lam2);[U,S,V] = svd(H);R = V*U';if det(R) < 0printf('Reflection detected\n');V(:,3) = -1*V(:,3);R = V*U';end%计算最终的旋转矩阵与平移向量t = -R./(lam2^(0.5))*centroid_A' + centroid_B';R = R./(lam2^(0.5));end

参考自:
http://nghiaho.com/?page_id=671
https://blog.csdn.net/sinat_29886521/article/details/77506426?utm_source=blogxgwz0

根据两个坐标系对应点计算转换关系(旋转和平移)相关推荐

  1. 通过两个坐标系对应点计算转换关系

    通过两个坐标系对应点计算转换关系 应用 三维重建方法通常会自己估计相机的 R,T R,T矩阵,这些矩阵定义了一个世界坐标系,在使用客观的评估方法如Middlebury来评估精度时,需要使用评估方法提供 ...

  2. 三维坐标系之间的转换关系详解与推导

    文章目录 前言 三维坐标系之间的转换关系:R(旋转矩阵) .T(平移矩阵) 数学模型描述 布尔莎模型:前提是旋转角为微小旋转角 罗德里格矩阵模型 尺度相同: 存在的一些问题: 主要参考来源: 前言 三 ...

  3. 三维视觉基础之世界坐标系、相机坐标系、图像坐标系和像素坐标系之间的转换关系

    三维视觉基础之世界坐标系.相机坐标系.图像坐标系和像素坐标系之间的转换关系 一.各坐标系介绍 二.世界坐标系和相机坐标系之间的转换 三.相机坐标系和图像坐标系之间的转换 四.图像坐标系和像素坐标系之间 ...

  4. 已知同一组点在不同坐标系下的坐标,如何求解两个坐标系之间的转换关系

    问题描述: 已知同一组点在不同坐标系下的坐标(例如有点ABCDEF六个点在坐标系1下的坐标A1,B1,C1,D1,E1,F1同时又已知ABCDEF六个点在坐标系2下的坐标A2,B2,C2,D2,E2, ...

  5. 相机成像---世界坐标系、相机坐标系、图像坐标系和像素坐标系之间的转换关系

    新学期第一天开始写的这篇文章,看看我啥时候能把他发出去.假期当然是啥也没干了,之前还信誓旦旦说回家一定能学习,学个毛线.开始学习啦,去年年末把环境配置好了之后,实验发现他不准,用的D435i摄像头是红 ...

  6. 坐标系之间的转换关系(ECEF、LLA、ENU)

    一 坐标系简介 1 ECEF坐标系 也叫地心地固直角坐标系.其原点为地球的质心,x轴延伸通过本初子午线(0度经度)和赤道(0deglatitude)的交点. z轴延伸通过的北极(即,与地球旋转轴重合) ...

  7. 双目视觉(一)-相机标定及各坐标系间转换关系

    本篇文章用来记录近期学习双目视觉定位的收获,后续我将随着不断深入学习对文章进行补充 视觉是人类感知外界环境信息的重要途径,其中人类约有80%的环境信息是通过双眼获取的.双目视觉系统是典型的类人视觉模型 ...

  8. 罗德里格斯公式推导(轴角与旋转矩阵的关系)以及四元数与旋转向量、旋转矩阵、欧拉角之间的转换关系

    罗德里格斯公式推导(轴角与旋转矩阵的关系) 意义:罗德里格斯公式表示旋转向量到旋转矩阵之间爱你的转换关系 旋转向量:一个向量,方向与旋转轴一致,长度等于旋转角度 空间中任意旋转都可以用一个旋转轴和一个 ...

  9. 无人机坐标系定义与转换

    [x]作者简介:热爱科研的无人机(机器人)导航.制导.控制开发者. 如有错误,请指正,不吝感谢! 1.前言 我们在研究无人机.机器人.无人车等相关领域的导航.制导与控制算法时,需要了解各个坐标系的定义 ...

最新文章

  1. 【MATLAB】稀疏矩阵(含有大量0元素的矩阵)
  2. 医院选址问题--数据结构课程设计
  3. C#向C++编写的DLL传递字符串参数的办法
  4. 精品教程---Android应用程序框架
  5. bzoj3192: [JLOI2013]删除物品(树状数组)
  6. MVC5应用程序目录
  7. 344.Reverse String
  8. 拜托,别再问我什么是 B+ 树了
  9. java归并算法实例_Java编程中实现归并排序算法的实例教程
  10. [bzoj4538][Hnoi2016]网络
  11. Chatopera王海良:大厂螺丝钉还是开源极客?年轻技术人如何选择?
  12. 外挂学习之路(10)--- 穿透发包线程寻找call的通杀方法
  13. python获取验证码失败_python 爬虫:验证码一直错误
  14. 报错解决——ModuleNotFoundError: No module named ‘cython_bbox‘
  15. 差点跑进奥运会赛场的“人类计算机之父”
  16. 1020 月饼 (25分) 冒泡排序
  17. html表格上方的标题怎么相对表格居中
  18. OpenGL-曲面细分
  19. Xshell的Sessions存放目录
  20. IOTOS通采盒为BIM运维、GIS、CIM、数字孪生及IBMS高效率、低成本打通数据,接入楼宇园区子系统设备

热门文章

  1. python for循环结构_python 循环结构(for-in)
  2. Flink Sort-Shuffle 实现简介
  3. ICN6202是一颗MIPI DSI转LVDS的桥接芯片
  4. C++的学习日记day8(类型转换、异常、输入输出流、文件)
  5. Multicore Navigator (CPPI):Notify end of QM interrupt
  6. 139邮件服务器怎么设置,移动139邮箱pop,imap,exchange设置参数
  7. (转)量子位:这个AI股神把顶级对冲基金吓尿了
  8. 小程故事多 | 看来微服务就是一把双刃剑
  9. Jacobi迭代法分量形式matlab,实验一线性方程组迭代法实验.doc
  10. PMP与ACP有什么区别?