标记跟踪+标记的透视扭曲



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

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

我做错什么了吗?

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

您的问题是从4x4转换为3x3。简单的答案是,你想去掉第三列和最下面的一行,得到3x3,然后用你的相机矩阵进行预乘。有关详细说明,请参阅此处

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

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

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

[x,y,0,1]

这使得你的第三栏变得无关紧要。

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

首先,你需要在标记在世界空间中的位置和扭曲后你希望它出现的位置之间进行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位置进行实验。它越小,在取消扭曲后,标记将显示得越大。

希望这能奏效,很抱歉对你的问题感到困惑。

最新更新