1.问题描述:

给点两个d维空间中的点集合

常用的转换关系可能包括以下几种:
(1)等距变换。需要求R和T。等距变换前后长度,面积,线之前的角度不变。常见于坐标转换、物体移动,姿态变化等。自由度6(3+3)

(2)相似变换。需要求R和T及缩放系数s。 常用于非刚体移动,或不同目标匹配对齐,目标缩放等。自由度7(6+1)

(3)仿射变换(正交投影)。平移变换T 和非均匀变换(A)的复合,A是可逆矩阵,不要求是正交矩阵。仿射变换对图像旋转+平移+缩放+切变(shear,也叫倾斜变换),相比前两种,变换图像的形状发生了改变,但是原图中平行线仍然保持平行。自由度12(9+3)

(4)射影变换(透视变换)
射影变换的不变量:重合关系、长度的交比,自由度:15(右下角v=1)
射影变换是对图像的旋转+平移+缩放+切边+射影。平行线变换后可能不再平行,而是交于一点。如平视图转换为鸟瞰图。

关于二维空间(图像)的变化可参考:基础知识:二维常见变换

2.1 等距变换求解

其求解数学表达式如下:

wi 表示每个点对之前的权重。
对于该问题共有6个自由度,至少需要两组点对,对矩阵求最小二乘解,该方法我们暂不讨论。
主流的做法是使用去中心化点集协方差矩阵SVD求解,步骤如下:
(1)构建上述问题模型:


(2)去中心化及协方差矩阵SVD分解求
计算中心值:

点集去中心化,去除转移矩阵的影响:

计算协方差矩阵:

SVD分解,求旋转矩阵

(3)计算转移矩阵

具体推导过程可参见:

利用SVD求得两个对应点集合的旋转矩阵R和转移矩阵t的数学推导
Least-Squares Rigid Motion Using SVD

python 代码参考 计算两个对应点集之间的旋转矩阵R和转移矩阵T
如下:

from numpy import *
from math import sqrtdef estimate_quilong_transform_3D(A, B):assert len(A) == len(B)N = A.shape[0];mu_A = mean(A, axis=0)mu_B = mean(B, axis=0)AA = A - tile(mu_A, (N, 1))BB = B - tile(mu_B, (N, 1))H = transpose(AA) * BBU, S, Vt = linalg.svd(H)R = Vt.T * U.Tif linalg.det(R) < 0:print "Reflection detected"Vt[2, :] *= -1R = Vt.T * U.Tt = -R * mu_A.T + mu_B.Treturn R, t

2.2 相似变换求解

在等距变换的基础上,点集P、Q的比例不一致。典型的应用为:3D模型融合,比如将给一个人头3D模型加上眼镜3d模型,两模型尺寸不一致,模型匹配时我们在人头和眼镜上各选取4个关键点,求解相似变换矩阵。
点集合P、Q的比例s不影响旋转矩阵R的求解,但是会影响T的结果。这是因为放大缩小是基于某一个参考坐标进行的,默认情况下对集合P的坐标乘以s进行缩放,等效于参考坐标为集合P的原点,那么集合P的中心位置也等效于乘了s,对应到T有平移分量。更合理的做法是将集合P的中心移到坐标原点,然后乘以缩放系数。
相似变换求解的难点通常在于点集P、Q的选取较为随意,无严格定位和对齐,因此估计出来的变化矩阵误差较大。
我们依然使用去中心化点集协方差矩阵SVD求解相似变换矩阵,
(1)估计出缩放系数s
首先计算点集合P、Q中所有点连成的线,线段个数为:n*(n-1)/2,然后计算所有线段的Ld阶长度。然后对两集合中所有线段长度相除得到n*(n-1)/2缩放系数。去除过短的线段和异常的缩放系数,剩下的取平均即可得到缩放系数的估计s。

(2)旋转矩阵R与转移矩阵T
旋转矩阵R求解过程与2.1相同。
不同于2.1的是,在2.1中计算转移矩阵时加入s

代码如下:

def get_all_side_length(points):all_dis=[]for i in range(len(points)-1):for j in range(i+1,len(points)):all_dis.append(points[i]-points[j])all_dis=np.array(all_dis)return np.linalg.norm(all_dis,axis=1)def get_scale(A,B):dis_A=get_all_side_length(np.array(A))dis_B=get_all_side_length(np.array(B))scale=np.abs(dis_B/dis_A)mask=np.abs(scale)>0.0001  scale_sort=np.sort(scale[mask].reshape(-1))d_n=len(scale_sort)s_mean=scale_sort[int(d_n/4):int(d_n*3/4)].mean() #only use medium datareturn s_meandef estimate_similarity_transform_3D(A, B):## 求解R assert len(A) == len(B)N = A.shape[0];mu_A = mean(A, axis=0)mu_B = mean(B, axis=0)AA = A - tile(mu_A, (N, 1))BB = B - tile(mu_B, (N, 1))H = transpose(AA) * BBU, S, Vt = linalg.svd(H)R = Vt.T * U.Tif linalg.det(R) < 0:print "Reflection detected"Vt[2, :] *= -1R = Vt.T * U.Ts_mean=get_scale(A,B)t = -s_mean * R * mu_A.T + mu_B.Treturn R, t  ,s_mean

2.3 仿射变换求解

仿射变换A的求解是典型的最小二乘求解方法,我们使用np.linalg.lstsq()方法。
自由度12,至少需要4对三维点(不共线)
代码:

def estimate_affine_transform_3D(A, B):'''A:[n,3] B[n,3]return:P_Affine:(3,4) the third row is [0,0,0,1]'''A_homo=np.hstack((A,np.ones([A.shape[0],1]))) #nx4P=np.linalg.lstsq(A_homo,Y)[0].T  #Affine matrix 3 x 4return Pdef P2sRt(P)''' decompositing camera matrix PP:(3,4) Affine Camera MatrixReturns:s:R:(3,3) rotation matrixt:(3,) translation'''t=P[:,3]R1=P[0:1,:3]R2=P[1:2,:3]s=(np.linalg.norm(R1) + np.linalg.norm(R2))/2.0r1=R1/np.linalg.norm(R1)r2=R2/np.linalg.norm(R2)r3=np.cross(r1,r2) #叉乘,三维空间两向量决定的平面法向量R=np.concatenate((r1,r2,r3),0)return s,R,t

2.4 射影变换求解

与仿射变换求解类似

3D点集之间计算转移矩阵,旋转R,转移T,新增缩放s (总结全面)相关推荐

  1. 计算两个对应点集之间的旋转矩阵R和转移矩阵T

    这篇文章的相应数学推到在这个地方,有兴趣的可以瞧一瞧计算两个点集合的旋转矩阵R和T的数学推导 假设有两个点集A和B,且这两个点集合的元素数目相同且一一对应.为了寻找这两个点集之间的旋转矩阵 R R R ...

  2. 基于ICP算法计算点集之间的变换矩阵(旋转、平移)

    前言 本文主要是计算两个激光雷达之间的变换矩阵,即计算两组点云之间的变换矩阵.其中处理的点云数据主要是由x,y,z,intensity组成的,代表空间位置x,ry,z 和每个点云对应的反射强度inte ...

  3. ITK:计算两个3D点之间的距离

    ITK:计算两个3D点之间的距离 内容提要 输出结果 C++实现代码 内容提要 计算两个3D点之间的距离.可以通过更改常量Dimension轻松地将其扩展为ND. 输出结果 Dist: 1.73205 ...

  4. 使用Python,OpenCV实现图像之间超快速的颜色转移

    图像之间超快速的颜色转移 1. 效果图 2. 步骤 3. 改进算法的方法 4. 源码 参考 目标:源图像与目标图像,转移源图像的色彩空间到目标图像,生成一张新的图像: 有关如何在两个图像之间转移颜色, ...

  5. 解构变换矩阵:如何使变换矩阵分解为位移(T),旋转(R),缩放(S)矩阵

    解构变换矩阵 给定一个转换的复合矩阵,关于组成该转换的任何单个转换的信息就会丢失. 我们如果有一个复合矩阵,怎么能使其分解为TRS三个矩阵呢?即如何完成下述变化: 其中M是给定的变换矩阵,T是平移矩阵 ...

  6. java实现3D动态效果_js实现3D粒子酷炫动态旋转特效

    js实现3D粒子酷炫动态旋转特效(效果比较酷炫,中途不仅有形态的变换,还有颜色的变化,希望大家能够喜欢) 代码实现过程中的静态截图 New Document html,body{ margin:0px ...

  7. 3D变形:平移、旋转、缩放、父子关系外间距塌陷

    3D变形:平移.旋转.缩放 什么是3d转换 定义元素在三维空间移动.缩放.旋转 3d坐标轴(图示) 3D立体空间的3根轴线 x轴:水平,向右为正,向左为负 y轴:垂直,向下为正,向上为负 z轴:垂直于 ...

  8. 3D变形:平移、旋转、缩放、立方体、盒子阴影

    3D变形:平移.旋转.缩放 什么是3d转换 定义元素在三维空间移动.缩放.旋转 3d坐标轴(图示) 3D立体空间的3根轴线 x轴:水平,向右为正,向左为负 y轴:垂直,向下为正,向上为负 z轴:垂直于 ...

  9. R语言生成仿真的3D高斯簇数据集、使用scale函数进行数据缩放、并使用KMeans进行聚类分析、数据反向缩放并比较聚类生成的中心和实际数据的中心的差异、预测新的数据所属的聚类簇

    R语言生成仿真的3D高斯簇数据集.使用scale函数进行数据缩放.并使用KMeans进行聚类分析.数据反向缩放并比较聚类生成的中心和实际数据的中心的差异.预测新的数据所属的聚类簇 目录

最新文章

  1. linux RTX2080显卡驱动
  2. 【数据结构】对排序的综合总结
  3. oracle 02380,oracle 11.2.0.3 fornb…
  4. js 根据条件禁止复选框_element-ui多选框根据不同条件禁用?
  5. Outlook2016怎么修改默认数据库
  6. 是什么造就了伟大的程序员?
  7. 同一个行业为什么股票差异大?
  8. 逆序数介绍以及算法实现浅析
  9. JS 同步本地时间和服务器时间
  10. 【Interfacenavigation】隐藏导航栏(52)
  11. groupadd 添加用户组
  12. C++程序设计一、二(二元一次方程与函数、函数指针)
  13. 硬核,创业公司就应该技术选型 Spring Cloud Alibaba, 开箱即用
  14. 计算机连接网络被限制,电脑连接wifi出现网络受限的解决方法
  15. 扦插技术图解_扦插葡萄生根最快方法(图解)
  16. 郭天祥的10天学会51单片机_第十三节
  17. C语言之贪吃蛇游戏源码
  18. 一年四季的时令蔬菜水果表
  19. 如何快速创建 Rproject 文件?
  20. If you don't build your dreamer, someone will hire you to build theirs!

热门文章

  1. C# 一些零零碎碎的方法,都是些帮助类,留存,也希望能帮助到各位
  2. rabbitmq guest/guest用户不能远程登录
  3. python打分_做一个Python颜值打分系统,比比看杨幂和杨超越到底谁更美?
  4. 商品促销倒计时效果实现
  5. 输入年月日判断当天是该年的第几天
  6. 阿里云天池大赛赛题(深度学习)——人工智能辅助构建知识图谱(完整代码)
  7. RESTful API 简介(学习笔记)
  8. matlab图片在word/wps中模糊解决方法,matlab图片转pdf后信息丢失解决方法
  9. 如何把图片缩小到200k?怎么压缩图片到指定像素?
  10. Linux下进行格式化移动硬盘(U盘)以及分区