Python 为什么getAffineTransform会生成如此奇怪的矩阵?

Python 为什么getAffineTransform会生成如此奇怪的矩阵?,python,opencv,opencv3.0,opencv3.1,Python,Opencv,Opencv3.0,Opencv3.1,我想创建一个仿射变换,这样在变换发生后,图像仍然以蓝点为中心,顶部红点距离图像顶部45%,底部红点距离图像底部25%。这里是一个示例: 这就是我现在拥有的: 要进行仿射变换,我将源点和目标点设置为: src = [[231, 281],[283,243],[285,379]] # blue dot, top red dot, bottom red dot dst = [[231, 281], [283, 243*0.45], [285, 379 * 0.75]] 并找到了转换矩阵: M =

我想创建一个仿射变换,这样在变换发生后,图像仍然以蓝点为中心,顶部红点距离图像顶部45%,底部红点距离图像底部25%。这里是一个示例:

这就是我现在拥有的:

要进行仿射变换,我将源点和目标点设置为:

src = [[231, 281],[283,243],[285,379]] # blue dot, top red dot, bottom red dot
dst = [[231, 281], [283, 243*0.45], [285, 379 * 0.75]]
并找到了转换矩阵:

M = cv2.getAffineTransform(src, dst)
但当我打印出矩阵时,我得到了:

M = [[   1.           -0.            0.        ]
    [  -2.33606605    1.32038334  449.60354104]]
这显然是错误的,因为出现在
M[1,0]
中的
-2.336
意味着变换矩阵在
y方向上倾斜,因此我的图像结果如下也就不足为奇了:

我的问题是我做错了什么?我是否选择了错误的点来定义仿射变换

编辑:在尝试了@Miki的建议后,这就是结果

这是wierd,因为你告诉它是wierd,使用
dst=[[231281],[283,图像高度*0.45],[285,图像高度*0.75]。
更新了我的问题,它仍然不是我们想要的,但看起来确实更好!还有其他建议吗?你还需要移动蓝点。。现在它仍然处于相同的位置。一般来说,你应该使用更多的点(可能是所有的地标?)并确定目标位置(相对于图像大小)。我知道的唯一目标点是三个点(蓝色的一个是最左侧和最右侧面部地标的平均坐标,还有两个红色的),那么我如何使用所有的地标呢?另外,因为我希望蓝色的点是图像的中心,蓝色的点不是必须是相同的坐标吗?谢谢你的帮助!为什么不更改dst向量中的X(第一)坐标?这是wierd,因为你告诉它是wierd,使用
dst=[[231281],[283,图像高度*0.45],[285,图像高度*0.75]。
更新了我的问题,它仍然不是我们想要的,但看起来确实更好!还有其他建议吗?你还需要移动蓝点。。现在它仍然处于相同的位置。一般来说,你应该使用更多的点(可能是所有的地标?)并确定目标位置(相对于图像大小)。我知道的唯一目标点是三个点(蓝色的一个是最左侧和最右侧面部地标的平均坐标,还有两个红色的),那么我如何使用所有的地标呢?另外,因为我希望蓝色的点是图像的中心,蓝色的点不是必须是相同的坐标吗?谢谢你的帮助!为什么不更改dst向量中的X(第一)坐标?