我有一些像这样的图像,我需要在其中找到中心矩形
我使用 EmguCV 示例的变体来查找矩形并附带此
using (MemStorage storage = new MemStorage())
{ //allocate storage for contour approximation
//Contour<Point> contours = gray.FindContours()
Contour<Point> contours = gray.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE,
Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_LIST,
storage);
for (; contours != null; contours = contours.HNext)
{
Contour<Point> currentContour = contours.ApproxPoly(contours.Perimeter * 0.05, storage);
//Seq<Point> currentContour = contours.GetConvexHull(Emgu.CV.CvEnum.ORIENTATION.CV_CLOCKWISE);
if (contours.Area > MinRectangleArea) //only consider contours with area greater than 20000
{
if (currentContour.Total == 4) //The contour has 4 vertices.
{
bool isRectangle = true;
Point[] pts = currentContour.ToArray();
LineSegment2D[] edges = PointCollection.PolyLine(pts, true);
for (int i = 0; i < edges.Length; i++)
{
double angle = Math.Abs(edges[(i + 1) % edges.Length].GetExteriorAngleDegree(edges[i]));
if (angle < 90 - RectangleAngleMargin || angle > RectangleAngleMargin + 90)
{
isRectangle = false;
break;
}
}
if (isRectangle)
{
boxList.Add(currentContour.GetMinAreaRect());
}
}
}
}
}
在这些图像上执行的结果有时会发现这两个矩形:
橙色矩形没问题,这就是我需要的。但我不想要蓝色。有时四个顶点在图像的边界内,通常其中一个在外。
将 FindContours 函数的 RETR_TYPE 更改为 CV_RETR_EXTERNAL,我只得到蓝色矩形,所以我想知道是否可以选择不获取带有外部点的轮廓。
真实图像实际上可以在橙色内有较小的矩形(或出现一条线分割矩形),所以在那之后我选择了更大的矩形作为我想要的那个,但不能用那个蓝色的矩形来做。