more lines
[imago.git] / ransac_grid.py
index 3e06002..4182555 100644 (file)
@@ -27,8 +27,26 @@ def to_general(line):
 def nearest(lines, point):
     return min(map(lambda l: dst(point, l), lines))
 
 def nearest(lines, point):
     return min(map(lambda l: dst(point, l), lines))
 
+def nearest2(lines, point):
+    return min(map(lambda l: dst(point, points_to_line(*l)), lines))
+
 size = (520, 390)
 
 size = (520, 390)
 
+def generate_models(sample, middle):
+    sgrid = map(lambda l:linef.line_from_angl_dist(l, size), sample) 
+    lh = (gm.intersection(sgrid[0], middle), gm.intersection(sgrid[1], middle))
+    for f in [0, 1, 2, 3, 5, 7, 8, 11, 15, 17]:
+        grid = gm.fill(sgrid[0], sgrid[1], lh , f)
+        grid = [sgrid[0]] + grid + [sgrid[1]]
+        for s in xrange(17 - f):
+            grid = [gm.expand_left(grid, middle)] + grid
+        yield grid
+        for i in xrange(17 - f):
+            grid = grid[1:]
+            grid.append(gm.expand_right(grid, middle))
+            yield grid
+
+
 points = pickle.load(open('edges.pickle'))
 
 lines = pickle.load(open('lines.pickle'))
 points = pickle.load(open('edges.pickle'))
 
 lines = pickle.load(open('lines.pickle'))
@@ -40,36 +58,31 @@ r_lines = pickle.load(open('r_lines.pickle'))
 
 l1, l2 = lines
 
 
 l1, l2 = lines
 
+lines_general = map(to_general, sum(lines, []))
+near_points = [p for p in points if nearest(lines_general, p) <= 2]
+score = lambda grid: len([p for p in points if nearest2(grid, p) <= 2])
+
 while True:
     l1s = random.sample(l2, 2)
     l1s.sort(key=lambda l: l[1])
 while True:
     l1s = random.sample(l2, 2)
     l1s.sort(key=lambda l: l[1])
-    corners = map(lambda l:linef.line_from_angl_dist(l, size), l1s) 
     middle = ((0, 195),(520, 195))
     middle = ((0, 195),(520, 195))
-    # TODO! can I assume anything to be perspectively disorted square?
+    # TODO! can I assume anything to be perspectively disorted square? No.
     # TODO! take lower and middle and construct top
     # TODO! take lower and middle and construct top
-    lh = (gm.intersection(corners[0], middle), gm.intersection(corners[1], middle))
-    grid = gm.fill(corners[0], corners[1], lh , 3)
-    grid = [corners[0]] + grid + [corners[1]]
-    grid.append(gm.expand(grid[-2], grid[-1], ((gm.intersection(middle, grid[-2]),
-                                         (gm.intersection(middle, grid[-1]))))))
-    grid.append(gm.expand(grid[-2], grid[-1], ((gm.intersection(middle, grid[-2]),
-                                         (gm.intersection(middle, grid[-1]))))))
+    # TODO iterate that ^^^?
+    
+    sc, grid = max(map(lambda g: (score(g), g), generate_models(l1s, middle)))
+    pyplot.scatter(*zip(*near_points))
     map(lambda l: pyplot.plot(*zip(*l), color='b'), grid)
 
     map(lambda l: pyplot.plot(*zip(*l), color='b'), grid)
 
-    plot_line(l1s[0], 'g')
+    plot_line(l1s[0], 'r')
     plot_line(l1s[1], 'r')
     plot_line(l1s[1], 'r')
-    
     pyplot.xlim(0, 520)
     pyplot.ylim(0, 390)
     pyplot.show()
 
 sys.exit()
 
     pyplot.xlim(0, 520)
     pyplot.ylim(0, 390)
     pyplot.show()
 
 sys.exit()
 
-lines_general = map(to_general, sum(lines, []))
-
-near_points = [p for p in points if nearest(lines_general, p) <= 2]
 
 
-pyplot.scatter(*zip(*near_points))
 
 
 for l in lines[0]:
 
 
 for l in lines[0]: