Opencv扭曲透视整个图像

Opencv Warp perspective whole image

本文关键字:图像 透视 Opencv      更新时间:2023-10-16

我正在努力解决这个问题:

我有一个图像,我想对它应用一个翘曲透视(我已经有了变换矩阵),但不是输出只有变换区域(像下面的例子),我想要能够看到整个图像。

http://docs.opencv.org/trunk/_images/perspective.jpg

例子

不像这个例子那样有一个变换区域,我想对整个原始图像进行变换。

我怎样才能做到这一点?

谢谢!

似乎您正在通过选择输入图像中的数独网格的角并要求它们在输出图像中的固定位置弯曲来计算透视变换。在您的示例中,似乎您要求左上角在坐标(0,0)处弯曲,右上角在坐标(300,0)处弯曲,左下角在坐标(0,300)处弯曲,右下角在坐标(300,300)处弯曲。

这将始终导致裁剪两个左角的左侧和两个上角上方的图像区域(即输出图像中x<0或y<0的图像区域)。另外,如果您指定的输出图像大小为300x300,这将导致右侧的图像区域被裁剪到右下角和底部角以下。

如果你想保留整个图像,你需要为角落使用不同的输出坐标。例如,将TLC转换为(100,100),TRC转换为(400,100),BLC转换为(100,400),BRC转换为(400,400),并指定输出图像大小为600x600。

你也可以计算最优坐标如下:

  1. 计算默认的透视变换H0(就像你现在做的那样)
  2. 使用H0变换输入图像的角,并计算这些角的x和y坐标的最小值和最大值。我们把它们记为xmin, xmax, ymin, ymax。
  3. 计算将点(xmin,ymin)映射到(0,0)所需的平移。这个平移的矩阵是T = [1,0, -xmin;0,1, -ymin;[0,0,1].
  4. 计算优化后的透视变换H1 = T*H0,并指定输出图像大小为(xmax-xmin) x (ymax-ymin)。

这样,您就可以保证:

  • 输入数独网格的四个角将形成一个真正的正方形
  • 输出图像将被翻译,以便没有有用的图像数据被裁剪到网格角的上方或左侧
  • 输出图像将被调整大小,以便没有有用的图像数据被裁剪到网格角的下方或右侧

然而,这会产生黑色区域,因为输出图像不再是一个完美的矩形,因此输出图像中的一些像素在输入图像中没有任何对应关系。

Edit 1:如果您想用其他东西替换黑色区域,您可以根据需要初始化目标矩阵,然后将warpPerspective函数的borderMode参数设置为BORDER_TRANSPARENT