我正在为这个问题而苦苦挣扎:
我有一张图像,我想对其应用扭曲透视(我已经有了变换矩阵),但我希望能够看到只有变换区域的输出(如下例所示)而不是整个图像。
EXAMPLE 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,例如。
您还可以按如下方式计算最佳坐标:
- 计算默认透视变换 H0(就像您现在所做的那样)
- 使用 H0 变换输入图像的角,并计算这些角的 x 和 y 坐标的最小值和最大值。我们将它们表示为 xmin、xmax、ymin、ymax。
- 计算将点 (xmin,ymin) 映射到 (0,0) 所需的平移。这个平移的矩阵是T = [1, 0, -xmin; 0, 1, -ymin; 0, 0, 1].
- 计算优化的透视变换 H1 = T*H0 并指定输出图像大小 (xmax-xmin) x (ymax-ymin)。
这样,您可以保证:
- 输入的数独网格的四个角将形成一个真正的正方形
- 输出图像将被转换,以便在网格角的上方或左侧没有有用的图像数据被裁剪
- 输出图像的大小将确保没有有用的图像数据被裁剪到网格角的下方或右侧
但是,这会产生黑色区域,因为输出图像不再是完美的矩形,因此输出图像中的某些像素与输入图像中没有任何对应关系。
编辑 1: 如果您想用其他东西替换黑色区域,您可以根据需要初始化目标矩阵,然后设置 borderMode
参数 warpPerspective
函数到 BORDER_TRANSPARENT
。
关于c++ - Opencv Warp透视全图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25164899/