Opencv Warp透视整个图像

时间:2014-08-06 15:54:25

标签: c++ opencv perspective

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

我有一个图像,我想对它应用一个扭曲透视图(我已经有了变换矩阵)但是输出只有变换区域(如下例所示)我希望能够看到而是整个图像。

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

我想要转换整个原始图像,而不是像转换区域一样。

我怎样才能做到这一点?

谢谢!

1 个答案:

答案 0 :(得分:1)

您似乎通过在输入图像中选择数独网格的角来计算透视变换,并请求它们在输出图像中的固定位置处变形。在您的示例中,您似乎要求左上角在坐标(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)。
  5. 这样,您可以保证:

    • 输入数独网格的四个角将形成一个真正的正方形
    • 将转换输出图像,以便在网格角上方或左侧没有裁剪有用的图像数据
    • 输出图像的大小将使得在网格角下方或右侧没有裁剪有用的图像数据

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

    编辑1:如果您想用其他内容替换黑色区域,可以根据需要初始化目标矩阵,然后设置borderMode warpPerspective参数函数到BORDER_TRANSPARENT