首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用5个三维点计算三维单应性

用5个三维点计算三维单应性
EN

Stack Overflow用户
提问于 2018-08-29 23:36:56
回答 1查看 1.1K关注 0票数 4

我在一个投影空间中有一组三维点,我想把它们转换成一个公制的三维空间,这样我就可以用米来测量距离。

为此,我需要3D到3D的单应性,它是一个具有15个自由度的4x4矩阵(因此我需要5个3D点才能得到15个方程)。我有一组来自投影空间的这5个3D点,以及它们在度量空间中对齐的相应的5个3D点(我希望5个投影点转换到该空间)。

我想不出如何估计单应矩阵。一开始我试过了:

代码语言:javascript
复制
A=np.vstack([p1101.T, p1111.T, p0101.T, p0001.T, p0011.T])
b=np.array([[1,1,0,1], [1,1,1,1], [0,1,0,1], [0,0,0,1], [0,0,1,1]])
x, _, _, _ = np.linalg.lstsq(A,b)
H = x.T

其中p1101是对应于3D度量空间中的1,1,0,1的X,Y,Z,1点,依此类推。然而,这是不正确的,因为我是在射影空间中,所以我需要创建一个方程式集,在这里我将H的行除以它的最后一行或类似的东西。

我想也许有一个实现的方法可以为我做到这一点,例如在opencv中,但没有找到。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-23 12:54:19

我终于和一个朋友解决了这个问题,并愿意分享这个解决方案。

因为在射影空间中,一个人需要求解一个方程组,其中结果的同源坐标是彼此坐标的分母。也就是说,如果你想找到一个4x4单应矩阵H,并且你有匹配的3D点x和b (b在物元空间中),你需要优化H参数的搜索,这样应用在x上的H会给出一个具有4个坐标的向量v,这样v的前三个坐标除以最后一个坐标就是B。写在numpy:

代码语言:javascript
复制
v = H.dot(x)
v = v[:3]/v[3]
v == b  # True

在数学上,优化是基于这样的(为了简单起见,这只集中在第一个坐标上,但其他坐标是以相同的方式完成的):

因此,在python中,需要以解释的方式排列求解器的方程,其中有5个匹配点。问题中的方法是好的(只是没有解决正确的问题),在这些方面,它将进行Ax=b最小二乘优化,使得A是15x15矩阵,b是15维向量。每个匹配点生成3个方程,然后5个匹配点将生成15个内置到矩阵A中的方程,从而求解3D单应性H的15个自由度。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52081318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档