parameters
[imago.git] / src / gridf3.py
index 8a1a216..5f90cb8 100644 (file)
@@ -2,9 +2,10 @@ import random
 from math import sqrt
 
 from intrsc import intersections_from_angl_dist
-import linef as linef
-import ransac as ransac
-import manual as manual
+import linef
+import params
+import ransac
+import manual_lines as manual
 from geometry import l2ad
 
 # TODO comments, refactoring, move methods to appropriate modules
@@ -127,7 +128,7 @@ class Line:
         elif key == 2:
             return self.c
 
-def gen_corners(d1, d2):
+def gen_corners(d1, d2, min_size):
     for c1 in d1.points:
         if c1 in d2.points:
             continue
@@ -136,6 +137,15 @@ def gen_corners(d1, d2):
             c2 = [p for p in d2.points if p in c1.l1.points][0]
             c3 = [p for p in d1.points if p in c2.l2.points][0]
             c4 = [p for p in d2.points if p in c3.l1.points][0]
+            x_min = min([c1[0], c2[0], c3[0], c4[0]])
+            x_max = max([c1[0], c2[0], c3[0], c4[0]])
+            if x_max - x_min < min_size:
+                continue
+            y_min = min([c1[1], c2[1], c3[1], c4[1]])
+            y_max = max([c1[1], c2[1], c3[1], c4[1]])
+            if y_max - y_min < min_size:
+                continue
+
         except IndexError:
             continue
             # there is not a corresponding intersection
@@ -152,6 +162,8 @@ def dst(p, l):
     return abs(a * x + b * y + c) / sqrt(a*a+b*b)
 
 def score(lines, points):
+    # TODO find whether the point actualy lies on the line or just in the same
+    # direction
     score = 0
     for p in points:
         s = min(map(lambda l: dst(p, l), lines))
@@ -161,7 +173,6 @@ def score(lines, points):
 
 
 def find(lines, size, l1, l2, bounds, hough, show_all, do_something, logger):
-    logger("finding the grid")
     new_lines1 = map(lambda l: Line.from_ad(l, size), lines[0])
     new_lines2 = map(lambda l: Line.from_ad(l, size), lines[1])
     for l1 in new_lines1:
@@ -180,8 +191,10 @@ def find(lines, size, l1, l2, bounds, hough, show_all, do_something, logger):
         return sqrt(x * x + y * y)
 
     for n_tries in xrange(3):
+        logger("finding the diagonals")
         model = Diagonal_model(points)
-        diag_lines = ransac.ransac_multi(6, points, 2, 800, model=model)
+        diag_lines = ransac.ransac_multi(6, points, 2,
+                                         params.ransac_diagonal_iter, model=model)
         diag_lines = [l[0] for l in diag_lines]
         centers = []
         cen_lin = []
@@ -195,7 +208,7 @@ def find(lines, size, l1, l2, bounds, hough, show_all, do_something, logger):
 
         if show_all:
             import matplotlib.pyplot as pyplot
-            import Image
+            from PIL import Image
 
             def plot_line_g((a, b, c), max_x):
                 find_y = lambda x: - (c + a * x) / b
@@ -216,6 +229,7 @@ def find(lines, size, l1, l2, bounds, hough, show_all, do_something, logger):
             image_p = Image.fromstring('RGB', size_f, buff, 'raw')
             do_something(image_p, "finding diagonals")
 
+        logger("finding the grid")
         data = sum(points, [])
         # TODO what if lines are missing?
         sc = float("inf")
@@ -227,7 +241,7 @@ def find(lines, size, l1, l2, bounds, hough, show_all, do_something, logger):
             diag2.points = ransac.filter_near(data, diag2, 2)
 
 
-            grids = list(gen_corners(diag1, diag2))
+            grids = list(gen_corners(diag1, diag2, min(size) / 3))
             
             try:
                 new_sc, new_grid = min(map(lambda g: (score(sum(g, []), data), g), grids))