我正在使用ARToolKit +跟踪标记。我收到了一个看起来正确的模型视图矩阵。现在,我想以一种方式扭曲图像,使标记看起来就像我直视它时的样子。但无论我做什么,结果看起来都非常扭曲。我知道ARToolKit以列主要顺序存储4x4矩阵,所以我修复了OpenCV。
到目前为止我尝试的是: 1)修改订单行主要订单 2)用cvInverse计算逆(虽然转换3x3旋转部分+反转翻译应该足够) 3)将该矩阵与cvPerspectiveWarp
一起使用我做错了吗?
TL; DR: 我想要这个:https://www.youtube.com/watch?v=qZ-LU-C2p2Q 我得到一些扭曲的线条和许多黑色。
答案 0 :(得分:2)
您的问题是从4x4转换为3x3。简短的回答是你要放下第3列和最后一行来制作3x3,然后用你的相机矩阵预乘。有关详细说明,请参阅here
<强>澄清强> 从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变换不是变形,它会使标记变形,它是将标记从原点移动到最终位置的变换。如你所说的那样对标记进行扭曲是类似的,但会略有不同。我之前没有这样做,但这是我的猜测。
首先,您需要在标记位于世界空间的位置和您希望它在变形之后的位置之间进行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位置。它越小,你的标记在去扭曲后就会越大。
希望这有效,抱歉对你的问题感到困惑。