我在物体坐标系中有我的目标的4个共面点的3D坐标。我在视频的每一帧中都有它们的2D坐标。我还计算了相机的内在参数(M),使用solvepnp()在对象坐标系和摄像机坐标系之间的R(旋转)和t(平移)矩阵。 我已经阅读了from here完整的过程,这一过程非常清楚。它也与我所遵循的过程类似。因此我想使用相同的等式
用于计算我的3D坐标,但我没有常数,因为链接解释了计算s。我的目标在OpenCV坐标系中围绕x轴旋转。我的问题是 -
答案 0 :(得分:1)
变量 s 具有特定含义:2D点与其3D反投影之间存在一对多的对应关系。换句话说,在光线上存在无数个可能的3D点,这些3D点最终在方向u,v,f方向上终止或从像素发射。这是关于:只是一对多关系的指标。
当一个度量重建模糊到规模时,似乎Francesco谈论了一个关于运动结构的一般情况。然而,问题可能完全不同。让我重新说一下,告诉我,如果我做对了:你有一个你知道的静态物体坐标系。你有一个围绕X轴在这个系统中旋转的目标,你知道这个系统中零点旋转的4个点的3d坐标。要在旋转后获得新的3D坐标,您需要的是一个旋转角度,同时给出一组已知点的2D投影。这是一项很容易的任务;如果它是你真正追求的。
为什么这项任务很简单?每个点都会产生两个约束,如u = v =;未知的数量是一个 - 角度,所以一个点足以计算它。知道此角度,您可以旋转已知的3D点以更新其坐标。总的来说只有1分就足以解决这个问题了:
技术上Ralpha - 我们的未知 - 仅依赖于角度α,但由于依赖性是非线性的,我们可以使用具有2个条目的矩阵的线性乘法:s = sin(alpha)和c = cos(alpha) ,alpha - 围绕x轴旋转的角度
1 0 0
Ralpha = 0 c -s
0 s c
通过注意s'摆脱s'。 = a 31 X + a 32 Y + a 32 Z + tz 并将其插入两个约束中:
s'u'=(a 31 X + a 32 Y + a 32 Z + t z )u'= a 11 X + a 12 Y + a 13 Z + t x
s'v'=(a 31 X + a 32 Y + a 32 Z + t z )v'= a 21 X + a 22 Y + a 23 Z + t y
找到矩阵A现在是解决线性方程组Kx = b的简单任务,其中通过重新排列我们的术语
b = [t x -t z u',t y -t z v'] T ,
x = [a 11 , 12 , 13 , 21 , 22 , 23 , 31 , 32 , 33 ] T
单点对应K是
-X, -Y, -Z, 0, 0, 0, Xu’, Yu’, Zu’
0, 0, 0, -X, -Y, -Z, Xv’, Yv’, Zv’
但如果有更多的对应关系,可以添加更多行。 用伪逆解决这个问题得到x =(K T K) -1 K T b, 这可以通过二次残差的非线性最小化进一步优化。
计算x并用它重新组合A后,你必须确保它是一个真正的旋转矩阵。通常这通过SVD完成:A = ULV T 然后重新分配A = UV T 。最后,获得Ralpha = R T A,它为您提供一个旋转矩阵,您可以将其应用于已知的3D坐标以在对象坐标系中获取其新值或使用整个矩阵A来获取它们在相机坐标系中。
这可能看起来很乱,但这是获取外部相机参数的典型步骤,你已经完成了这个(尽管你可能使用了库函数)。
答案 1 :(得分:1)
编辑:Vlad可能最准确地解决了您的问题。以下内容可能仍有助于澄清一般情况下的数学。
如果您知道R和t,那么您的问题可以简化为估算(X 0 ,Y 0 ,Z 0 )下面的等式,其中M,u和v是已知的:
s u,v [uv 1] T = M [X 0 Y 0 Z 0 子>] Ť
请注意,s u,v 不是常数因子,而是取决于u和v。由于M的特殊形式,即最后一个元素等于1的对角线,我们可以很容易地看到那 小号<子> U,V 子> = Z <子> 0 子>。因此,如果你只知道M,R,t,u和v,你只能估计(X 0 / Z 0 ,Y 0 / Z <子> 0 子>,1)。这意味着无法估计两个不同图像点之间的相对深度(它们都具有等于1的深度),因此您无法获得真正的3D重建。
为了估计两个图像点的相对深度,您需要在两个图像中对相同点进行至少两次观察(由具有不同位置的相机获取)。而且,正如Francesco所指出的,即使你有两个图像,你也无法估计重建场景的真实比例,除非你另外知道两点之间的真实3D距离D.
答案 2 :(得分:0)
仅当您知道绝对比例时,例如图像中可见的已知对象的长度。
但你真的关心绝对的规模和距离吗?你应该长时间地考虑你的应用,然后决定你是否真的需要知道物理距离和尺寸。很难做到正确,特别是如果需要很高的准确度,并且通常没有必要。
答案 3 :(得分:0)
要将单应矩阵(将世界中的平面映射到其图像)分解为旋转和平移,请遵循以下5个步骤:
注意,通过去掉Z坐标的占位符,可以简化M * [R | T] * [x,y,0,1] T 。这相当于以Z = 0的方式在平面上定位物体坐标系
2.请注意,这有效地杀死了旋转矩阵中的第三列,因此针孔相机方程看起来像单应性:
s [u,v,1] T = M * R | T * [x,y,1] = H * [x,y,1],其中
[R | T =
r 11 r 12 t x
r 21 r 22 t y
r 31 r 32 t z
3.现在在Homography中加入内在矩阵M:
M * R | T = H,则R | T = M -1 H = H2。
使用SVD分解H 2:H 2 = ULV T
然后用W代替L,用W表示缩放均匀,单位用真正的旋转; R | T则变为UWV T ,其中W =
1 0
0 1
0 0
4.通过向量积r3 = r1xr2计算R的第三列
保证它与前两个正交,R是一个真正的旋转矩阵
5.您可以选择通过分解比例因子来恢复转换T,该比例因子是k = sum(R ij / H2 ij )/ 6其中i = 1..3 ,j = 1..2,然后计算T = k * H2的第三列。最后,如果Tz <0,则逆R和T