generalized RANSAC
authorTomas Musil <tomik.musil@gmail.com>
Sat, 5 Jul 2014 22:41:04 +0000 (00:41 +0200)
committerTomas Musil <tomik.musil@gmail.com>
Sat, 5 Jul 2014 22:41:04 +0000 (00:41 +0200)
src/gridf3.py
src/linef.py
src/ransac.py

index 693b8ee..5852115 100644 (file)
@@ -172,9 +172,9 @@ def find(lines, size, l1, l2, bounds, hough, show_all, do_something, logger):
     points = [l.points for l in new_lines1]
 
     for trial in xrange(3):
-        line1, cons = ransac.estimate(points, 2, 800, Diagonal_model)
-        points2 = map(lambda l: [(p if not p in cons else None) for p in l], points)
-        line2, cons2 = ransac.estimate(points2, 2, 800, Diagonal_model)
+        model = Diagonal_model(points)
+        diag_lines = ransac.ransac_multi(2, points, 2, 800, model=model)
+        [(line1, cons), (line2, cons2)] = diag_lines
         center = intersection(line1, line2)
         data = sum(points, [])
         diag1 = Line(line1)
index ab7c95d..2b2b86b 100644 (file)
@@ -58,7 +58,7 @@ def run_ransac(image):
                 data.append((x, y))
 
     dist = 3 
-    (line, points), (line2, points2) = ransac.ransac_duo(data, dist, 75, 15)
+    [(line, points), (line2, points2)] = ransac.ransac_multi(2, data, dist, 250)
     line_to_points = lambda (a, b, c), x: (x, (a*x + c) / (- b))
     # TODO width should not be here vvv
     # TODO refactor gridf to use standard equations instead of points
index cc16d2f..6557ea4 100644 (file)
@@ -48,6 +48,9 @@ class Linear_model:
             score += min(d, dist)
         return score, cons
 
+    def remove(self, data):
+        self.data = list(set(self.data) - set(data))
+
 def iterate(model, distance):
     score = float("inf")
     consensual = model.initial()
@@ -78,20 +81,13 @@ def estimate(data, dist, k, modelClass=Linear_model, model=None):
 
     return estimate, consensual
 
-def ransac_duo(data, dist, k, mk, modelClass=Linear_model):
-    cons = []
-    for i in xrange(mk):
-        model, cons = estimate(set(data) - set(cons), dist, k, modelClass)
-    return (model, cons), estimate(set(data) - set(cons), dist, k, modelClass)
-
 def ransac_multi(m, data, dist, k, modelClass=Linear_model, model=None):
+    if not model:
+        model = modelClass(data)
     ests = []
     cons = []
     for i in xrange(m):
         est, cons_new = estimate(None, dist, k, model=model)
         model.remove(cons_new)
-        ests.append(est)
+        ests.append((est, cons_new))
     return ests
-
-        
-