3

我在预处理原始图像后得到了这个图像。现在,我的问题是如何获得矩形的四个角坐标(最大)。对不起,如果这是一个菜鸟问题。

在此处输入图像描述

更新:由于我正在使用 OpenCV 进行开发,因此最终使用了这个答案

4

1 回答 1

6

One simple way would be to:

  1. find all connected components
  2. calculate the convex hull for each component
  3. pick the component where the convex hull has the largest area
  4. simplify the convex hull polygon
  5. the vertices of the simplified polygon are the points you're looking for

Quick&dirty Mathematica solution:

(* find all connected components, calculate the convex hull for each component *)
convexHulls = ComponentMeasurements[ColorNegate[Binarize[src]], {"ConvexArea", "ConvexVertices"}];

(* pick the component where the convex hull has the largest area *)
vertices = SortBy[convexHulls[[All, 2]], First][[-1, 2]]

(* simplify the convex hull polygon, by iteratively removing the vertex with the lowest distance to the line through the vertex before and after it *)
distanceToNeighbors[vertices_] := MapThread[Abs[(#1 - #2).Cross[#1 - #3]/Norm[#1 - #3]]&, RotateLeft[vertices, #] & /@ {-1, 0, 1}]
removeVertexWithLowestDistance[vertices_] := With[{removeIndex = Ordering[distanceToNeighbors[vertices], 1]}, Drop[vertices, removeIndex]]
verticesSimplified = NestWhile[removeVertexWithLowestDistance, vertices, Min[distanceToNeighbors[#]] < 10&]

(* the vertices of the simplified polygon are the points you're looking for *)
Show[src, Graphics[
  {
   {EdgeForm[Red], Transparent, Polygon[verticesSimplified]},
   {Red, PointSize[Large], Point[verticesSimplified]}
   }]]

Result

于 2012-04-12T16:52:12.263 回答