opencv更新单应矩阵,使其适合两倍大小的图像

opencv更新单应矩阵,使其适合两倍大小的图像,opencv,Opencv,我在用光流做视频稳定。为了使calcOpticalFlowPyrLK工作得更快,我将原始图像缩小2倍,并在其上运行该函数 如何修改同形图矩阵(通过findHomography检索),以便能够透视原始的较大图像。假设B是您计算的变换,您可以将B乘以另一个同形图A,得到AB=C,其中C是同时进行两种变换的同形图,这相当于先应用B,然后应用A。要找到可以使用的A 编辑:对于AB,我指的是矩阵乘法,而不是元素乘法 编辑2:要获得A,您需要以相同的顺序传递两幅图像的四个角,以便下采样图像的角点是源点,原始

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


如何修改同形图矩阵(通过findHomography检索),以便能够透视原始的较大图像。

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

编辑:对于AB,我指的是矩阵乘法,而不是元素乘法


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

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

正如您所提到的,我通过findHomography获得了B。你的意思是我应该通过getPerspectiveTransform获得一个视频?我应该向getPerspectiveTransform发送什么?我有原始图像,原始图像,灰度,光流,单应性。getPerspectiveTransform应该非常有效,在一台像样的机器上3x3矩阵乘法应该不到1毫秒。它不起作用。它只显示了图像的一角:我不想更改图像的大小,我想更改FindHomeography中的参数,以便将它们应用于更大的原始图像。MB这有效吗?如果不是的话,为什么你要把这个标记为正确答案?很好的补充。谢谢