3

抱歉,如果这是一个愚蠢的问题,我对 3D 工作非常陌生。

我有许多针孔相机,它们具有 3x3 旋转矩阵和基于原点 (0,0,0) 的平移向量。

我正在使用的系统可以移动原点并旋转相机(尽管所有相机都保持相对),从而为每个相机生成一个新的旋转矩阵和平移向量,我可以访问它们。

那么我的问题是:给定一个在原始空间中具有 3D 位置的点,如何使用同一摄像机(或多个摄像机)的新旋转/平移来计算新空间中同一点的 3D 位置?

当我问问题时,有没有更有效的方法?

4

2 回答 2

0

我假设你的点的位置是相对于原点矩阵的,你说它可以被平移/旋转。

假设所有这些都是必要的,您点的新位置由下式给出:

pos_newCoord = R^-1 * T^-1 * pos_oldCoord

你正在做的是你把你的新起源,翻译回旧起源,然后把它解开。另一种写法:

newOrigin = myTranslation(myRotation(oldOrigin))
def newCoordinates(point):
    return inverse(myRotation)(inverse(myTranslation)(point))

您可以预先计算逆运算,尤其是在使用 4d 矩阵时。


如何根据相机的旋转和平移变化来确定原点的旋转和平移变化? ” -OP

如果您没有被告知此信息,您可以通过以下方式恢复它。我们将使用 4d 点和 4v4 仿射变换矩阵 (en.wikipedia.org/wiki/Affine_transformation)。

  • 拿任意4个相机。
  • 考虑原始相机点与它们的平移/旋转点。
  • 可能有更好的线性代数方法可以做到这一点,但是如果您访问 Wikipedia 链接,我们会注意到有一个 3x3 子矩阵 A 和一个 3x1 子矩阵 b,因此有 12 个未知数。4 个点,每点 3 个方程,为您提供 12 个方程。有一个解决方案,因为这种形式的矩阵是可逆的*。使用您最喜欢的线性方程系统求解技术求解,例如 12x12 矩阵上的高斯消元法。
于 2011-06-22T00:43:26.613 回答
0

我建议使用齐次坐标来跟踪矩阵和变换。我认为您的问题是如何在不同的相机视图之间来回转换点。

如果您将相机变换表示为单个矩阵运算M,那么倒退就可以了inverse(M)。更好的是,如果您的相机矩阵由多个步骤组成,您可以反转这些步骤。例如,如果M=rotatex(theta) * scale(sx, sy, sz) * translate(x, y, z),那么inverse(M) = translate(-x, -y, -z) * scale(1/sx, 1/sy, 1/sz) * rotatex(-theta)。请注意,您还必须颠倒顺序。这是“袜子/鞋子”属性。你穿上袜子,然后穿上鞋子。反转你脱鞋,然后脱掉袜子。

一旦您可以从每个相机前进和后退,您就可以轻松地在任何相机视图之间交换点。

于 2011-06-21T23:44:02.137 回答