2

我正在使用 ARToolKit+ 跟踪标记。我收到一个看起来差不多的模型视图矩阵。现在我想扭曲图像,使标记看起来就像我直视它时的样子。但无论我做什么,结果看起来都非常扭曲。我知道 ARToolKit 按列主要顺序存储 4x4 矩阵,所以我为 OpenCV 修复了它。

到目前为止我尝试的是:1)将顺序固定为行主要顺序 2)使用 cvInverse 计算逆(尽管转置 3x3 旋转部分 + 反转平移就足够了) 3)使用 cvPerspectiveWarp 矩阵

难道我做错了什么?

tl;博士:我想要这个:https ://www.youtube.com/watch?v=qZ-LU-C2p2Q 我得到一些扭曲的线条和很多黑色。

4

1 回答 1

2

您的问题是从 4x4 转换为 3x3。简短的回答是您想删除第 3 列和底行以制作 3x3,然后与您的相机矩阵进行预乘。有关更长的解释,请参见此处

澄清 您从 ARTK 获得的姿势代表从一个地方到另一个地方的转换。当我说“初始图像出现时没有旋转”时,我的意思是您的变换从没有围绕 x 或 y 轴旋转的初始状态变为当前状态。对于大多数增强现实应用程序来说,这是一个很好的假设,我提到它只是为了彻底。

至于为什么可以删除第 3 列。由于您正在变换平面,因此您的 z 坐标可以完全由您的 x 和 y 坐标表示,给定您的平面方程。如果我们假设最初没有旋转,那么您的初始 z 坐标是一个常数值。如果存在旋转,则 z 不是恒定的,但它会根据其平面方程在 x 和 y 中确定性地变化,该平面方程仍然可以用一个矩阵表示(尽管您不需要它)。由于在您的情况下,您的 4x4 变换可能表示从平放在 z = 0 处的标记到其当前位置的变换,因此 4x4 矩阵的第 3 列什么都不做(全部乘以 0),因此可以在不影响的情况下删除它结果。

简而言之:忘记旋转的东西,它比你需要的更复杂,只要意识到变换是从初始坐标到最终坐标,你的初始坐标总是

[x,y,0,1]

这使您的第三列无关紧要。

更新 对不起!我刚刚重新阅读了您的问题,并意识到您只是想扭曲标记,使其看起来像一个直视,我陷入了描述从 4x4 到 3x3 的一般变换。您从 ARTK 获得的 4x4 变换不是使 Warker 变形的变换,而是将标记从原点移动到其最终位置的变换。像你问的那样对标记进行变形,过程类似,但会略有不同。我以前没有这样做过,但这是我的猜测。

首先,您需要在标记在世界空间中的位置与您希望它在变形后出现的位置之间进行 4x4 变换。现在转换从原点到标记位置。要将变换更改为从 z 轴上更远的某个点(例如 100)到标记位置,请定义变换。

initial_marker_pose = [1,0,0,0
                       0,1,0,0
                       0,0,1,100
                       0,0,0,1];

现在你有了从原点到你想要的“初始”位置的转换,以及从原点到“最终”位置的转换。简单地获得从初始到最终的转换

initial_to_final = origin_to_marker*initial_marker_pose.inv();

现在您将按照我给您的链接中概述的过程进行操作,在这种情况下,您的初始 zpos 不再是 0,而是 100。然后,当您完成后,您需要反转您的 3x3 矩阵。那是因为此过程将您从一个直接的视图带到由 ARTK 的姿势定义的视图,而您想要相反的。您将需要尝试初始 z 位置。它越小,去扭曲后你的标记就会越大。

希望这有效,对于您的问题感到困惑,我们深表歉意。

于 2012-12-07T05:44:53.343 回答