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

时间:2015-06-24 11:36:06

标签: c# opencv computer-vision emgucv

我有这样的图像:

Original Image

接下来,我使用一些技巧来获得数独网格的轮廓。为了演示,这里有一张图片:(绿色=边界框,红色=轮廓)

enter image description here

现在我的问题;我怎么能把这个变成一个完美的广场呢?我曾试图使用cvWarpPerspective,但我似乎无法弄清楚如何从轮廓中获取角点(红线)。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

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

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

如何将梯形实际转换为正方形?

首先,裁剪/设置roi到目标:

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在评论中添加的那样,网上有大量的例子。但是"将四边形变换为矩形的步骤"非常简单:

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