even more robust gridf3
authorTomas Musil <tomik.musil@gmail.com>
Sun, 6 Jul 2014 02:52:48 +0000 (04:52 +0200)
committerTomas Musil <tomik.musil@gmail.com>
Sun, 6 Jul 2014 02:52:48 +0000 (04:52 +0200)
src/gridf3.py

index e1b8c9f..8685846 100644 (file)
@@ -172,66 +172,71 @@ def find(lines, size, l1, l2, bounds, hough, show_all, do_something, logger):
             l2.points.append(p)
 
     points = [l.points for l in new_lines1]
+
     def dst_p(x, y):
         x = x - size[0] / 2
         y = y - size[1] / 2
         return sqrt(x * x + y * y)
 
-    model = Diagonal_model(points)
-    diag_lines = ransac.ransac_multi(6, points, 2, 800, model=model)
-    diag_lines = [l[0] for l in diag_lines]
-    centers = []
-    cen_lin = []
-    for i in xrange(len(diag_lines)):
-        line1 = diag_lines[i]
-        for line2 in diag_lines[i+1:]:
-            c = intersection(line1, line2)
-            if c and dst_p(*c) < min(size) / 2:
-                cen_lin.append((line1, line2, c))
-                centers.append(c)
-
-    if show_all:
-        import matplotlib.pyplot as pyplot
-        import Image
-
-        def plot_line_g((a, b, c), max_x):
-            find_y = lambda x: - (c + a * x) / b
-            pyplot.plot([0, max_x], [find_y(0), find_y(max_x)], color='b')
-
-        fig = pyplot.figure(figsize=(8, 6))
-        for l in diag_lines:
-            plot_line_g(l, size[0])
-        pyplot.scatter(*zip(*sum(points, [])))
-        pyplot.scatter(*zip(*centers), color='r')
-        pyplot.xlim(0, size[0])
-        pyplot.ylim(0, size[1])
-        pyplot.gca().invert_yaxis()
-        fig.canvas.draw()
-        size_f = fig.canvas.get_width_height()
-        buff = fig.canvas.tostring_rgb()
-        image_p = Image.fromstring('RGB', size_f, buff, 'raw')
-        do_something(image_p, "finding diagonals")
-
-    data = sum(points, [])
-    # TODO what if lines are missing?
-    sc = float("inf")
-    grid = None
-    for (line1, line2, c) in cen_lin:
-        diag1 = Line(line1)
-        diag1.points = ransac.filter_near(data, diag1, 2)
-        diag2 = Line(line2)
-        diag2.points = ransac.filter_near(data, diag2, 2)
-
-
-        grids = list(gen_corners(diag1, diag2))
-        
-        try:
-            new_sc, new_grid = min(map(lambda g: (score(sum(g, []), data), g), grids))
-            if new_sc < sc:
-                sc, grid = new_sc, new_grid
-        except ValueError:
-            pass
-    if not grid:
+    for n_tries in xrange(3):
+        model = Diagonal_model(points)
+        diag_lines = ransac.ransac_multi(6, points, 2, 800, model=model)
+        diag_lines = [l[0] for l in diag_lines]
+        centers = []
+        cen_lin = []
+        for i in xrange(len(diag_lines)):
+            line1 = diag_lines[i]
+            for line2 in diag_lines[i+1:]:
+                c = intersection(line1, line2)
+                if c and dst_p(*c) < min(size) / 2:
+                    cen_lin.append((line1, line2, c))
+                    centers.append(c)
+
+        if show_all:
+            import matplotlib.pyplot as pyplot
+            import Image
+
+            def plot_line_g((a, b, c), max_x):
+                find_y = lambda x: - (c + a * x) / b
+                pyplot.plot([0, max_x], [find_y(0), find_y(max_x)], color='b')
+
+            fig = pyplot.figure(figsize=(8, 6))
+            for l in diag_lines:
+                plot_line_g(l, size[0])
+            pyplot.scatter(*zip(*sum(points, [])))
+            if len(centers) >= 1:
+                pyplot.scatter([c[0] for c in centers], [c[1] for c in centers], color='r')
+            pyplot.xlim(0, size[0])
+            pyplot.ylim(0, size[1])
+            pyplot.gca().invert_yaxis()
+            fig.canvas.draw()
+            size_f = fig.canvas.get_width_height()
+            buff = fig.canvas.tostring_rgb()
+            image_p = Image.fromstring('RGB', size_f, buff, 'raw')
+            do_something(image_p, "finding diagonals")
+
+        data = sum(points, [])
+        # TODO what if lines are missing?
+        sc = float("inf")
+        grid = None
+        for (line1, line2, c) in cen_lin:
+            diag1 = Line(line1)
+            diag1.points = ransac.filter_near(data, diag1, 2)
+            diag2 = Line(line2)
+            diag2.points = ransac.filter_near(data, diag2, 2)
+
+
+            grids = list(gen_corners(diag1, diag2))
+            
+            try:
+                new_sc, new_grid = min(map(lambda g: (score(sum(g, []), data), g), grids))
+                if new_sc < sc:
+                    sc, grid = new_sc, new_grid
+            except ValueError:
+                pass
+        if grid:
+            break
+    else:
         raise GridFittingFailedError
         
     grid_lines = [[l2ad(l, size) for l in grid[0]],