在下面的MWE代码中(取自Matlab documentation),T
给出了R
后跟T*R
的转换,而不是大多数情况下的R*T
计算机图形学或视觉教科书。
cb = checkerboard(4,2);
cb_ref = imref2d(size(cb));
background = zeros(150);
imshowpair(cb,cb_ref,background,imref2d(size(background)))
T = [1 0 0;0 1 0;100 0 1];
tform_t = affine2d(T);
R = [cosd(30) sind(30) 0;-sind(30) cosd(30) 0;0 0 1];
tform_r = affine2d(R);
TR = T*R; % This line
tform_tr = affine2d(TR);
[out,out_ref] = imwarp(cb,cb_ref,tform_tr);
imshowpair(out,out_ref,background,imref2d(size(background)))
如果我们想先通过x
然后通过x'
将图像T
转换为R
,我们不应该做x'=R(T(x))=R*T*x
吗?
从代码中,tt在我看来是我们正在做x'=T*R*x
。这是没有意义的,因为输出实际上在做x'=R*T*x
。文档中没有解释此行为。
转换前:
转换后:
答案 0 :(得分:0)
这是因为Matlab使用了不同的约定。他们执行x'=T*x
等于transpose(x')=transpose(T*x)
而不是计算transpose(x)*transpose(T)
。由于变换矩阵现在为RIGHT-MULTIPLIED,因此顺序也发生了变化。现在,第一个转换位于左侧。 (该函数的输入参数已经是transpose(T)
,而不是T
。)
除了affine2d
和projective2d
之外,由cameraMatrix
创建的投影矩阵也被转置-它的形状为4x3
而不是传统的3x4
。
我不确定他们为什么要这样做,here可以找到一些讨论。我真的希望他们能在imwarp
,projective2d
等文档中更好地解释/指出这一点。我花了几个小时才弄清楚。