我有这样的图像:
接下来,我使用一些技巧来获得数独网格的轮廓。为了演示,这里有一张图片:(绿色=边界框,红色=轮廓)
现在我的问题;我怎么能把这个变成一个完美的广场呢?我曾试图使用cvWarpPerspective,但我似乎无法弄清楚如何从轮廓中获取角点(红线)。
非常感谢任何帮助!
答案 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在评论中添加的那样,网上有大量的例子。但是"将四边形变换为矩形的步骤"非常简单: