6

我正在使用光流进行视频稳定。为了使 calcOpticalFlowPyrLK 工作得更快,我将原始图像缩小 2 倍并在其上运行该函数。

如何修改单应矩阵(通过 findHomography 检索)以能够对原始的、更大的图像进行 warpPerspective。

4

2 回答 2

10

这有点晚了,你的答案很好,但我要补充一件事。我不喜欢将 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 一样工作(并且可能运行得更快)。希望理解这一点可以帮助您处理可能遇到的有关图像分辨率更改的其他问题。

于 2012-07-23T23:45:00.967 回答
4

假设 B 是您计算的变换,您可以将 B 乘以另一个单应性 A,得到 AB = C,其中 C 是进行两种变换的单应性,这相当于先应用 B,然后应用 A。要找到 A,您可以使用getPerspectiveTransform

编辑: AB 我的意思是矩阵乘法,而不是元素乘法。

编辑2:要获得A,您将两个图像的四个角以相同的顺序传递给getPerspectiveTransform,这样下采样图像的角是源点,原始图像的角是目标点。

于 2012-05-29T22:07:10.740 回答