我正在使用光流进行视频稳定。为了使calcOpticalFlowPyrLK更快地工作,我将缩小原始图像2x并运行该函数。
如何修改同形异义矩阵(通过findHomography检索)以便能够对原始的更大的图像进行warpPerspective。
答案 0 :(得分:9)
这有点晚了你得到的答案很好,但我有一件事要补充。我不喜欢将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相同(并且可能运行得更快)。希望了解这一点有助于您处理有关图像分辨率变化的其他问题。
答案 1 :(得分:4)
设B是你计算的变换,你可以将B乘以另一个单应性A,得到AB = C,其中C是进行两种变换的单应性,这相当于先应用B,然后应用A.找到A你可以使用getPerspectiveTransform。
AB的编辑:我的意思是矩阵乘法,而不是逐元素乘法。
编辑2:以获得A您将两个图像的四个角以相同的顺序传递到getPerspectiveTransform,以便下采样图像的角是源点和角点原始图像是目的地点。