Python 仿射变换与预期的平移不一致
嗯,标题并不完全准确。我正在处理的变换是一种透视变换,可以很好地近似为仿射变换,但它不会产生与我期望的仿射变换相近的结果,甚至当我使用纯仿射变换时,结果仍然是以意想不到的方式修改变换的平移部分 我从表示变换矩阵的Python 仿射变换与预期的平移不一致,python,opencv,numpy,matrix,transform,Python,Opencv,Numpy,Matrix,Transform,嗯,标题并不完全准确。我正在处理的变换是一种透视变换,可以很好地近似为仿射变换,但它不会产生与我期望的仿射变换相近的结果,甚至当我使用纯仿射变换时,结果仍然是以意想不到的方式修改变换的平移部分 我从表示变换矩阵的numpy数组开始,如下所示: transformation = np.array([[.5, .1, 40], [.06, -.18, 725], [.00003, .00001
numpy
数组开始,如下所示:
transformation = np.array([[.5, .1, 40],
[.06, -.18, 725],
[.00003, .00001, 1]])
real_affine= np.array([[.5, .1, 40],
[.06, -.18, 725],
[0, 0, 1]])
translation = np.array([[1, 0, 0],
[0, 1, 50],
[0, 0, 1]])
然后我编写它们,希望得到(至少大约)作为转换的结果。dot(translation)
:
这一个用于实仿射点(翻译)
:
也就是说,修改y平移值时进行相同的精确变换。相反,我得到的是:
>>> transformation.dot(translation)
array([[ 5.00000000e-01, 1.00000000e-01, 4.50000000e+01],
[ 6.00000000e-02, -1.80000000e-01, 7.16000000e+02],
[ 3.00000000e-05, 1.00000000e-05, 1.00050000e+00]])
>>> real_affine.dot(translation)
array([[ 5.00000000e-01, 1.00000000e-01, 4.50000000e+01],
[ 6.00000000e-02, -1.80000000e-01, 7.16000000e+02],
[ 0.00000000e+00, 0.00000000e+00, 1.00000000e+00]])
这是怎么回事?这是相同的精确转换(除了翻译),但翻译值与我预期的不一致
为我的无知道歉,我从未正式研究过矩阵或变换。答案可能非常明显。您的
转换
不是仿射的。仿射矩阵的最后一行必须是0。。。0 1
。因此,它不需要转换。对不起,我想包括第一个转换是近似仿射的,所以我想知道为什么我得到的结果与我期望的仿射转换相差如此之远。我将问题编辑为包含real\u affine
,这是一个仿射翻译,仍然不能产生预期的结果。我仍然不理解您的期望。一般来说,任意仿射变换不会与平移进行转换。唯一可以转换的仿射变换是平移到平移、旋转到围绕同一轴旋转、旋转到均匀缩放以及缩放到缩放。你说的“转换”是什么意思?当它们相乘时,无论顺序如何,都会产生相同的结果?如果是这样,那不是我的问题。我只是想知道为什么它们不像我所描述的那样组合,我会认为所有矩阵变换(甚至透视变换)都是这样。你的假设通常是错误的。实际上,你声称加上仿射矩阵和乘上仿射矩阵是一样的,这显然是错误的。你的变换
不是仿射的。仿射矩阵的最后一行必须是0。。。0 1
。因此,它不需要转换。对不起,我想包括第一个转换是近似仿射的,所以我想知道为什么我得到的结果与我期望的仿射转换相差如此之远。我将问题编辑为包含real\u affine
,这是一个仿射翻译,仍然不能产生预期的结果。我仍然不理解您的期望。一般来说,任意仿射变换不会与平移进行转换。唯一可以转换的仿射变换是平移到平移、旋转到围绕同一轴旋转、旋转到均匀缩放以及缩放到缩放。你说的“转换”是什么意思?当它们相乘时,无论顺序如何,都会产生相同的结果?如果是这样,那不是我的问题。我只是想知道为什么它们不像我所描述的那样组合,我会认为所有矩阵变换(甚至透视变换)都是这样。你的假设通常是错误的。实际上,你声称加上仿射矩阵和乘上仿射矩阵是一样的,这显然是错误的。
np.array([[.5, .1, 40],
[.06, -.18, 775],
[0, 0, 1]])
>>> transformation.dot(translation)
array([[ 5.00000000e-01, 1.00000000e-01, 4.50000000e+01],
[ 6.00000000e-02, -1.80000000e-01, 7.16000000e+02],
[ 3.00000000e-05, 1.00000000e-05, 1.00050000e+00]])
>>> real_affine.dot(translation)
array([[ 5.00000000e-01, 1.00000000e-01, 4.50000000e+01],
[ 6.00000000e-02, -1.80000000e-01, 7.16000000e+02],
[ 0.00000000e+00, 0.00000000e+00, 1.00000000e+00]])