具有任意轮廓的OpenCV变换形状为矩形

Ale*_*mov 7 java android opencv image image-processing

简短的问题是如何使用OpenCV将下面的形状转换为矩形?

在此输入图像描述

笔记:

  1. 形状轮廓不一定是直线 - 它们可以略微弯曲.
  2. 形状内的内容必须相应地沿x轴和y轴拉伸.

长篇故事:
我试图在纸张折叠2到4次之后纠正代表纸张的图像的扭曲,文本,徽标等,使其几乎完全呈矩形.

输入图像已经是黑白格式,并具有更正的透视.所以一切都很好,除了它在扭曲的边缘周围有黑色区域,文字有点波浪状.

我的想法是序列应该是这样的:

  1. 找到工作表轮廓
  2. 计算校正矩阵以将形状区域映射到适当的矩形区域
  3. 使用计算的矩阵变换图像

也就是我们用来执行透视校正Imgproc.findContours,然后找到工作台角落,然后Imgproc.getPerspectiveTransform使用Imgproc.warpPerspective并执行校正.

但我找不到适合这种情况的算法.

任何人都可以指出如何在图像处理中获得它吗?

小智 0

在这种情况下,您希望对该图像进行非线性变换。传统上,您会使用整张纸的一次转换将其变成一个矩形。这可以仅用角来完成。更复杂的校正(例如镜头畸变),您需要在页面上选取点并断言它们应该共面以生成变换矩阵。基本上,您需要了解图像中的几何形状才能消除其扭曲。因此,您需要找到的几何图形是页面的 3 维表面。

为了找到受损纸张的高度非线性几何形状,您可以拍摄该页面的多个图像并对它们进行三角测量。如果您想走这条路,请阅读 Hartley 和 Zisserman 撰写的《Multiple View Geometry》。