从轮廓和扭曲角度寻找角点

Find corners from contour and warp perspective

我有这样一张图片:

接下来我使用一些技巧来获得数独网格的轮廓。为了演示,这里有一张图片:(green=boundingbox, red=contour)

现在我的问题;我怎样才能把它变成一个完美的正方形?我曾尝试使用 cvWarpPerspective,但我似乎无法弄清楚如何从轮廓(红线)中获取角点。

如有任何帮助,我们将不胜感激!

好的。你有拼图梯形的轮廓。你有边界框。您想要一个 漂亮的 正方形。这是您系统的主观部分。例如,您可以将目标高度对齐到宽度:

Rect target(0,0,boundbox.width,boundbox.width);

如何把梯形变成正方形?

首先,crop/set目标的投资回报率:

Mat cropped = source_image(target);

然后,您使用源四边形和目标四边形找到 homography matrix

Point SourceTrapezoid[4]; // the trapezoid points, with boundbox.x and y subtracted
Point TargetSquare[4]; // 0,0, roi.width, roi.height
Mat homography_mat = findHomography(InputArray srcPoints, InputArray dstPoints)

请注意,TargetSquare 中的点必须按与 SourceTrapezoid 中相同的顺序列出(例如,全部按顺时针方向)。

接下来,只需应用转换:

Mat transformed;
perspectiveTransform(cropped, transformed, homography_mat);

并将变形后的框复制到它的位置:

transformed.copyTo(source_image(target));

我用c++ opencv api给了你一个例子,但是c api是等价的。检查 opencv 文档以获取等效方法。

正如用户 LSA 在评论中添加的那样,网络上有大量示例。但是"transform quadrilateral into rectangle"的步骤很简单:

  1. 确定目标矩形的纵横比和位置(如果适用)
  2. 将目标矩形的点作为源四边形正确排序
  3. 计算单应性
  4. 应用透视变换
  5. 将生成的图像放在您想要的位置(如果适用)