这有点晚了,你的答案很好,但我有一点要补充。我不喜欢将像 getPerspectiveTransform 这样的函数视为理所当然。在这种情况下,自己制作矩阵很容易。图像缩小到 2 的幂很容易。假设您有一个点,并且想要将其移动到分辨率两倍的图像上。
float newx = (oldx+.5)*2 - .5;
float newy = (oldy+.5)*2 - .5;
相反,要转到分辨率一半的图像......
float newx = (oldx+.5)/2 - .5;
float newy = (oldy+.5)/2 - .5;
如果需要的话,给自己画一个图表并说服自己它有效,记住 0 索引。不要考虑让您的变换适用于其他分辨率,而是考虑将每个点移动到变换的分辨率,然后使用您的变换,然后将其移回来。幸运的是,您可以在 1 个矩阵中完成所有这些工作,我们只需要构建该矩阵!首先为三个步骤中的每一个建立一个矩阵
//move point to an image of half resolution, note it is equivalent to the above equation
project_down=(.5,0,-.25,
0,.5,-.25,
0, 0, 1)
//move point to an image of twice resolution, these are inverses of one another
project_up=(2,0,.5,
0,2,.5,
0, 0,1)
只需将它们组合起来即可进行最终的转换
final_transform = [project_up][your_homography][project_down];
好处是对于任何给定的单应性,您只需执行一次此操作。这应该与 getPerspectiveTransform 的工作方式相同(并且可能运行得更快)。希望理解这一点能够帮助您处理可能遇到的有关图像分辨率更改的其他问题。