我有一个初始框架和一些信息的边界框。我有一个转换矩阵T
,我想用它来转换这个边界框。
我可以轻松地应用转换并在输出框架中绘制它,但我想在一系列x
帧上应用转换,有人可以提出一种方法吗?
阿里
答案 0 :(得分:1)
在@ egor -n注释的基础上,您可以计算R = T ^ {1 / x}并在第i帧上从第i帧计算您的边界框
B_{i+1} = R * B_{i}
使用B_ {0}您的初始边界框。根据T的精确形式,我们可以讨论如何计算R。
答案 1 :(得分:1)
有仿射变换的方法 - 将仿射变换矩阵分解为平移,旋转,缩放和剪切矩阵的乘积,以及每个矩阵的参数的线性插值(例如,R的旋转角度等)。 Example
但是对于单应性矩阵,没有单一的解,as described here,所以人们可以找到一些“好的”近似值(在那篇文章中看一下复杂的数学)。可能,可能的转换的一些限制可以简化问题。
答案 2 :(得分:1)
这是你可以尝试的一些不同的东西。设M
为表示最终转换的矩阵。您可以尝试使用公式在I
(单位矩阵,对角线为1,其他位置为0)之间进行插值
M(t) = exp(t * ln(M))
其中t
是从0到1的时间,M(0) = I
,M(1) = M
,exp
是通常的无限级数给出的矩阵的指数函数,{{1对于由通常的无穷级数给出的矩阵,它是类似的自然对数函数。
公式的正确性取决于ln
表示的转换类型以及中间步骤中允许的转换类型。该公式适用于刚性运动。对于其他类型的转换,可能会发生各种不良事件,包括对数序列的分歧。其他公式可用于其他情况;让我知道如果你使用的是刚性运动以外的变换,我可以给出一些其他的公式。
指数和对数函数可以在矩阵库中使用。如果没有,它们可以很容易地实现为无限级数的部分和。
在旋转的情况下,上述方法应该给出与一些四元数方法相同的结果。四元数方法在可用时可能更快。
更新
我看到你在别处提到你的转换是单应性(透视),所以我上面提出的刚性运动的方法是行不通的。相反,您可以使用ftp://ftp.cs.huji.ac.il/users/aristo/papers/SYGRAPH2005/sig05.pdf中概述的其他相关方法。它如下:用一个更高维度的矩阵表示你的转换。缩放矩阵,使其行列式等于1.调用生成的矩阵M
。您希望通过透视度从身份矩阵G
进行插值到I
。
在下文中,让G
成为M^T
的转置。让函数M
由
expp
您需要在expp(M) = exp(-M^T) * exp(M+M^T)
找到该函数的反函数;换句话说,你需要解决方程式
G
其中expp(M) = G
是带有行列式的变换矩阵1.调用结果G
。该等式可以通过标准数值技术求解,或者您可以使用Matlab或其他数学软件。这样做有点费时费力,但你只需要做一次。
然后按
计算一系列变换M = logp(G)
其中G(t) = expp(t * logp(G))
以1 / k为步长从0变为1,其中k是您想要的帧数。
答案 3 :(得分:0)
您可以通过添加域大于零但小于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]'
2D中的变换变为:
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_n
处,您将变换T(t)应用于时间t_0 = 0处的对象位置(相当于无变换)