我有一个相机矩阵(我知道内在参数和外在参数),其尺寸为HxW。 (我将此矩阵用于所需的一些计算。)我想使用一个较小的图像,例如:$ \ frac {H} {2} \ times \ frac {W} {2} $ (原始的一半)。
为了保持相同的关系,我需要对矩阵进行哪些更改?

我有$ K $作为内在参数,($ R $,$ T $旋转和平移)

$$ \ text {cam} = K \ cdot [RT] $$

$$ K = \ left(\ begin {array}&a_x&0&u_0 \\ 0&a_y&v_0 \\ 0&0&1 \ end {array} \ right)$$

$ K $是3 * 3,我想乘$ a_x $ ,$ a_y $,$ u_0 $和$ v_0 $减0.5(调整图像大小的因素),但我不确定。

#1 楼

注意:这取决于您在调整大小后的图像中使用的坐标。我假设您使用的是从零开始的系统(例如C,与Matlab不同),并且0转换为0。而且,我假设您在坐标之间没有任何偏移。如果确实有偏斜,也应该乘以偏斜

简短的答案:假设您使用的坐标系中$ u'= \ frac {u} {2},v'= \ frac {v} {2} $,是的,应该将$ a_x,a_y,u_0,v_0 $乘以0.5。

详细的答案将世界坐标中的点$ P $转换为相机坐标$(x,y,z,1)->(u,v,S)$是:

$$ \ left(\ begin {array} {ccc}
a_x &0&u_0 \\
0&a_y&v_0 \\
0&0&1 \ end {array} \ right)
\ left(\ begin {array} {ccc}
R_ {11}&R_ {12}&R_ {13}&T_x \\
R_ {21}&R_ {22}&R_ {23}&T_y \\
R_ {31 }&R_ {32}&R_ {33}&T_z \\
0&0 0和1
\ end {array} \ right)
\ left(\ begin {array} { ccc}
x \\
y \\
1
\ end {array} \ right)
$$

在$(u,v,S)->(u / S,v / S,1)$的地方,因为坐标是同质的。 br /> $ u = \ frac {m_1 P} {m_3 P},v = \ frac {m_2 P} {m_3 P} $
其中$ M $是t的乘积上面提到的两个矩阵,$ m_i $是矩阵$ M $的第i行。 (该产品为标量产品)。

重新调整图像大小可以考虑:

$$ u'= u / 2,v'= v / 2 $ $

因此

$$ u'=(1/2)\ frac {M_1 P} {M_3 P} \\
v'=(1 / 2)\ frac {M_2 P} {M_3 P}
$$

转换回矩阵形式可以得到:

$$
\ left (\ begin {array} {ccc}
0.5&0&0 \\
0&0.5&0 \\
0&0&1 \ end {array} \ right)
\ left(\ begin {array} {ccc}
a_x&0&u_0 \\
0&a_y&v_0 \\
0&0&1 \ end {array} \对)
\ left(\ begin {array} {ccc}
R_ {11}&R_ {12}&R_ {13}&T_x \\
R_ {21}&R_ {22}&R_ {23 }&T_y \\
R_ {31}&R_ {32}&R_ {33}&T_z \\
0&0&0&1
\ end {array} \ right)
\ left(\ begin {array} {ccc}
x \\
y \\
z \\
1
\ end {array} \ right)
$$

等于

$$ \ left(\ begin {array} {ccc}
0.5 a_x&0& 0.5 u_0 \\
0&0.5 a_y&0.5 v_0 \\
0&0&1 \ end {array} \ right)
\ left(\ begin {array} {ccc}
R_ {11}&R_ {12}&R_ {13}&T_x \\
R_ {21}&R_ {22}&R_ {23}&T_y \\
R_ {31 }&R_ {32}&R_ {33}&T_z \\
0&0 0和1
\ end {array} \ right)
\ left(\ begin {array} { ccc}
x \\
y \\
1
\ end {array} \ right)
$$

有关其他信息,请参阅第3章Forsyth-几何摄像机校准。

评论


$ \ begingroup $
非常感谢您的解释!我只是不确定您从零开始的系统是什么意思,我使用的是matlab,是否需要其他任何调整?
$ \ endgroup $
– Matlabit
2012年11月21日15:31



$ \ begingroup $
@matlabit,如果您使用的是Matlab,则应将转换与$ u'=(u-1)/ 2 + 1,v'=(v-1)/ 2 + 1 $一起使用,因为它具有基于一个的索引(第一个元素为1,而不是0)。在这种情况下,请尝试计算相关矩阵。如果您不需要亚像素精度,则可以忽略它并使用我给您的公式。
$ \ endgroup $
– Andrey Rubshtein
2012年11月21日19:15



#2 楼

安德烈(Andrey)提到,他的解决方案假设将0转换为0。如果使用像素坐标,则在调整图像大小时可能不正确。您真正需要做的唯一假设是,您的图像变换可以由3x3矩阵表示(如Andrey演示的那样)。要更新相机矩阵,您可以将其乘以代表图像变换的矩阵。

[new_camera_matrix] = [image_transform]*[old_camera_matrix]


例如,您需要通过因子$ 2 ^ n $,您正在使用0个索引像素坐标。您的坐标通过以下关系转换

$ x'= 2 ^ n *(x + .5)-。5 $

$ y'= 2 ^ n *(y + .5)-。5 $

可以用矩阵表示

$
\ left(\ begin {array} {ccc}
2 ^ n&0&2 ^ {n-1}-。5 \\
0&2 ^ n&2 ^ {n-1}-。5 \\
0&0&1 \ end {array} \ right)
$

,这样您最终的相机矩阵将是}
2 ^ n&0&2 ^ {n-1}-。5 \\
0&2 ^ n&2 ^ {n-1}-。5 \\
0 &0&1 \ end {array} \ right)
\ left(\ begin {array} {ccc}
0&ay&v_0 \\
0&0&1 \ end {array} \ right)
$

评论


$ \ begingroup $
请您解释一下为什么加.5然后减去.5吗? 0.5仅适用于因数$ 2 ^ n $缩放吗?如果不是,如何计算该子像素数?
$ \ endgroup $
–Gurumonster
2014年10月3日在7:07

$ \ begingroup $
我想说的是,像素“ 0,0”的中心不是真正在“ 0,0”(=像素的左上角),而是在“ 0.5,0.5”。因此,您必须在转换之前和之后考虑该偏移量,并且无论缩放比例因子如何,该因子始终为0.5。
$ \ endgroup $
– JanRüegg
17年2月2日在8:36

$ \ begingroup $
是的,完全正确
$ \ endgroup $
–锤子
17年2月2日在20:40