用opencvSharp实现在任意多边形内找出近似最大的内接矩形
在网上搜了挺多求任意多边形内最大的内接矩形的文章,但是都不怎么符合我的需求,然后再 这个网站找到了思路,由于里面有些步骤看不太懂,于是就变通了一下,参考里面的方法,用比较简化的方法实现了需求,这个简化的方法优点是容易理解,缺点是可能不怎么精确,但也足够近似,可以用了,先看看结果。
原图:
结果:
更准确的结果:
1.先求出多边形的近似轮廓,减少轮廓数量,方便后面计算:
var src = Cv2.ImRead("C:\\Users\\Administrator\\Desktop\\test.png", ImreadModes.Grayscale);
Cv2.FindContours(src, out var contours, out var hierarchy, RetrievalModes.External,
ContourApproximationModes.ApproxSimple);
List<Point[]> approxContours = new List<Point[]>();
for (int i = 0; i < contours.Length; i++)
{
//先求出多边形的近似轮廓,减少轮廓数量,方便后面计算
var approxContour = Cv2.ApproxPolyDP(contours[i], 15, true);
approxContours.Add(approxContour);
DrawContour(src, approxContour, Scalar.White, 3);
}
2.根据上面的近似轮廓绑定最小外接矩形:
3.在多边形最小外接矩形里画满给定宽高的矩形,但只有在轮廓内的矩形才会画出来,可以看出还有一些空位没有填满,但如果画的矩形再小一点,精度会更高
给定宽高35X35像素的矩形
给定宽高20X20像素的矩形
4. 遍历所有在轮廓内部的矩形索引,以该矩形左上角的点为标准,先往右找出最大的宽,再往下找出最大的高,构建一个假定的大矩形,再遍历假定大矩形内的每一个小矩形,两两再次组合成一个矩形,不断比较,算出最大面积。
步骤就是这些,思路比较简单暴力,花费时间也还可以接受,完整代码如下:
public Form1()
{
InitializeComponent();
var src = Cv2.ImRead("C:\\Users\\Administrator\\Desktop\\test.png", ImreadModes.Grayscale);
Cv2.FindContours(src, out var contours, out var hierarchy, RetrievalModes.External,
ContourApproximationModes.ApproxSimple);
List<Point[]> approxContours = new List<Point[]>();
for</