Math 随时间应用变换矩阵

Math 随时间应用变换矩阵,math,graphics,transformation,Math,Graphics,Transformation,我有一个初始框架和一个围绕一些信息的边界框。我有一个变换矩阵T,我想用它来变换这个边界框 我可以很容易地应用转换并在输出帧中绘制它,但是我想在一系列x帧上应用转换,有人能建议一种方法吗 Aly基于@egor-n comment,您可以计算R=T^{1/x},并从第i帧处的边界框计算第i+1帧上的边界框 B_{i+1} = R * B_{i} 使用B_{0}创建初始边界框。根据T的精确形式,我们可以讨论如何计算R。仿射变换有多种方法-将仿射变换矩阵分解为平移、旋转、缩放和剪切矩阵的乘积,并对每个

我有一个初始框架和一个围绕一些信息的边界框。我有一个变换矩阵
T
,我想用它来变换这个边界框

我可以很容易地应用转换并在输出帧中绘制它,但是我想在一系列
x
帧上应用转换,有人能建议一种方法吗


Aly

基于@egor-n comment,您可以计算R=T^{1/x},并从第i帧处的边界框计算第i+1帧上的边界框

B_{i+1} = R * B_{i}

使用B_{0}创建初始边界框。根据T的精确形式,我们可以讨论如何计算R。

仿射变换有多种方法-将仿射变换矩阵分解为平移、旋转、缩放和剪切矩阵的乘积,并对每个矩阵的参数进行线性插值(例如,R的旋转角等)


但对于单应矩阵,并没有单一的解决方案,所以我们可以找到一些“好”的近似值(看看那篇文章中的复杂数学)。可能,对可能的转换的一些限制可以简化问题。

您可以通过添加域大于零但小于1的变量,在一定数量的帧上对转换进行参数化

Let t be the frame number
Let T be the total number of frames
Let P be the original location and orientation of the object
Let theta be the total rotation angle
and translation be the vector [x,y]'
二维变换变为:

T(P|t) = R(t)*P +(t*[x,y]')/T

 where R(t) = {{Cos((theta*t)/T),-Sin((theta*t)/T)},{Sin((theta*t)/T),Cos((theta*t)/T)}}

因此,在第
t\u n
帧,您将变换t(t)应用于时间t\u 0=0时对象的位置(这相当于不进行变换)

这里有一些您可以尝试的稍微不同的东西。设
M
为表示最终转换的矩阵。您可以尝试使用以下公式在
I
(单位矩阵,对角线上为1,其他地方为0)之间插值

M(t) = exp(t * ln(M))
其中,
t
是从0到1的时间,
M(0)=I
M(1)=M
exp
是通常无限级数给出的矩阵的指数函数,
ln
是通常无限级数给出的矩阵的类似自然对数函数

公式的正确性取决于
M
表示的转换类型以及中间步骤中允许的转换类型。该公式适用于刚性运动。对于其他类型的转换,可能会发生各种不好的事情,包括对数级数的发散。在其他情况下可以使用其他公式;如果你使用的是非刚体运动的变换,请告诉我,我可以给出一些其他公式

指数函数和对数函数可以在矩阵库中找到。否则,它们可以很容易地实现为无穷级数的部分和

在旋转的情况下,上述方法应给出与某些四元数方法相同的结果。四元数方法在可用时可能更快

更新

我看到您在其他地方提到,您的变换是单应性(透视性),因此我上面建议的刚性运动方法将不起作用。相反,您可以使用中概述的不同但相关的方法。它是这样的:用一个更高维的矩阵来表示你的变换。对矩阵进行缩放,使其行列式等于1。调用生成的矩阵
G
。您希望通过透视法从单位矩阵
I
插值到
G

下面,让
M^T
作为
M
的转置。让函数
expp

expp(M) = exp(-M^T) * exp(M+M^T)
您需要在
G
处找到该函数的倒数;换句话说,你需要解这个方程

expp(M) = G
其中
G
是行列式为1的变换矩阵。调用结果
M=logp(G)
。这个方程可以通过标准的数值技术来求解,也可以使用Matlab或其他数学软件。这有点费时和复杂,但你只需要做一次

然后通过以下公式计算变换序列:

G(t) = expp(t * logp(G))

其中,
t
以1/k的步长从0到1变化,其中k是所需的帧数。

尝试将每个帧作为一个变换,该变换等于
i/x*t
,其中
i
是帧,
x
是总帧数。