opencv更新单应矩阵以适合尺寸加倍的图像

MB.*_*MB. 6 opencv

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

如何修改同形异义矩阵(通过findHomography检索)以便能够对原始的较大图像进行warpPerspective.

Ham*_*mer 9

这有点晚了你得到的答案很好,但我有一件事要补充.我不喜欢将getPerspectiveTransform这样的函数视为理所当然.在这种情况下,很容易自己制作矩阵.图像缩减是2的幂是很容易的.假设您有一个点,并且想要将其移动到分辨率为两倍的图像.

float newx = (oldx+.5)*2 - .5;
float newy = (oldy+.5)*2 - .5;
Run Code Online (Sandbox Code Playgroud)

相反,要拍摄一半分辨率的图像......

float newx = (oldx+.5)/2 - .5;
float newy = (oldy+.5)/2 - .5;
Run Code Online (Sandbox Code Playgroud)

如果你需要并说服自己它有用,请绘制自己的图表,记住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)
Run Code Online (Sandbox Code Playgroud)

要进行最终转换,只需将它们组合起来

final_transform = [project_up][your_homography][project_down];
Run Code Online (Sandbox Code Playgroud)

好的是你只需要为任何给定的单应性做一次.这应该与getPerspectiveTransform相同(并且可能运行得更快).希望了解这一点将有助于您处理有关图像分辨率更改可能遇到的其他问题.


fir*_*ant 4

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

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

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