opencv 在逆图像投影中,我是否需要在与R逆相乘后将t向量添加或减去相机坐标?

rggaifut  于 2023-06-24  发布在  其他
关注(0)|答案(1)|浏览(101)

我目前正在一个逆图像投影任务中处理对象、相机和世界坐标之间的转换。我有以下可用信息:

  • 以(u,v,1)的形式的对象的图像坐标
  • 欧拉角转换为旋转矩阵(R)
  • 所述平移向量(t)表示所述相机与所述GNSS接收器之间的距离
  • 相机矩阵(K)和GNSS位置。

为了将相机坐标转换为世界坐标,我遵循了文献中概述的步骤。首先,我通过对固有矩阵K求逆来计算相机坐标(Xc,Yc,Zc):

λ * [Xc, Yc, Zc] = K^(-1) * [u, v, 1]

接下来,我想通过反转外部矩阵[R]将相机坐标(Xc,Yc,Zc)变换为世界坐标(X,Y,Z|这个等式正确吗?:

[X, Y, Z] = R^(-1) * ( [Xc, Yc, Zc] * t )

这就是我困惑的地方。在我的特定情况下,所需的世界坐标对应于相机检测到的对象。因此,我认为应该将平移向量(t)添加到相机坐标中,如下所示:

[X, Y, Z] = R^(-1) * ( [Xc, Yc, Zc] + t )

然而,从我对文档的理解来看,似乎t通常被减去:

[X, Y, Z] = R^(-1) * ( [Xc, Yc, Zc] - t )

我希望澄清我的理解是否正确,以及我是否应该增加或减少甚至乘以我的情况下的平移向量。
重要的是要注意,平移向量(t)I has是通过手动测量相机与GNSS接收器之间的距离来获得的。我没有得到通常通过solvePnP获得的t向量。我是否需要使用solvePnP生成的t向量,或者手动测量的t向量是否足以满足我的目的?

x6yk4ghg

x6yk4ghg1#

通常的相机方程由下式给出:
s(u v 1) = K(RX+t)其中s是任意真实的,(u,v)是物体的像素坐标,R,t是相机的外部参数,K是内部矩阵。
因此,您通常无法仅从2D位置恢复3D位置(直观),您只能找到击中相应像素的光线的方向。这在这里通过标量s的存在来建模。
因此,如果你想恢复3D姿势,你必须首先反转X:

X = R^(-1)*[s*K^(-1)*(u v 1) - t]
X = sR^(-1)*K^(-1)*(u v 1) - R^(-1)*t

现在你必须使用你的“相机和GNSS接收器之间的距离”,我将用字母d表示。不要把它与上面使用的t混淆,它们的意思不一样。
相机中心和物体之间的距离因此是d,但它也等于相机中心和物体位置X之间的差的范数:

d = ||sR^(-1)*K^(-1)*(u v 1)||

因为- R^(-1)*t等于相机中心。
因此,你可以找到s的值(或者更准确地说,是s的绝对值,因为s也可能是负的,但对象可能在相机后面,这可能不是你要找的):

s = d/||R^(-1)*K^(-1)*(u v 1)||

现在你可以代入上面的等式来求X的值。

X = d * [R^(-1)*K^(-1)*(u v 1)]/||R^(-1)*K^(-1)*(u v 1)|| - R^(-1)*t

请检查我的计算,我写得很快。

相关问题