根据相机在原点改变前后的旋转/平移确定点的位置

3

如果这是一个愚蠢的问题,我很抱歉,因为我非常新手在3D工作中。

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

我正在使用的系统可以移动原点并旋转相机(但所有相机之间保持相对),从而导致每个相机的新旋转矩阵和平移向量,我可以访问。

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

还有,当我提问时,是否有更有效的方法?


你能把那个问题简化并呈现出其本质吗? - P i
我认为“本质”就是:在相机针孔模型的外参数发生变化前后,如何找到一个点的新3D位置,假设其原点改变了? - user807068
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个相机。
  • 考虑原始相机点与它们的平移/旋转点之间的差异。
  • 可能有更好的线性代数方法,但是如果您访问维基百科链接,我们会注意到有一个3x3子矩阵A和一个3x1子矩阵b,因此有12个未知数。每个点3个方程式的4个点给出12个方程式。由于这种形式的矩阵是可逆的*,因此有解。使用您喜欢的线性方程组求解技术解决,例如在12x12矩阵上进行高斯消元。

谢谢您的输入!我的下一个问题是如何确定以原点为基础的旋转和平移变化,基于相机的旋转和平移变化。 - user807068
如果您没有被告知这些信息,可以按如下方式恢复它:取4个相机,并考虑它们的原始点与它们的翻译/旋转点。我们将使用4d点和4v4仿射变换矩阵(http://en.wikipedia.org/wiki/Affine_transformation)。可能有更好的线性代数方法来解决它,但您可以注意到有一个3x3子矩阵A和一个3x1子矩阵b,因此有12个未知数。每个点3个方程式的4个点给出12个方程式。由于这种形式的矩阵是可逆的,所以有解。使用高斯消元求解。 - ninjagecko

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)。请注意,您还必须颠倒顺序。这是“穿袜子/鞋子”的属性。您先穿上袜子,然后穿上鞋子。要反转,您需要先脱掉鞋子,然后脱掉袜子。

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


感谢您的回复!不幸的是,我知道如何在静态场景中在摄像机视图之间进行切换。我的问题是关于当选择一个新点作为原点时会发生什么,改变相机相对于新原点的旋转/平移,尽管相机在“真实空间”中是静止的。因此,例如,对于每个相机,我将有两组旋转和平移矩阵:一个是原点更改之前的,另一个是原点更改之后的。是否有任何方法可以使用这些值来确定一个点相对于新原点的位置,基于其先前的位置? - user807068

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接