From: Tomas Musil Date: Sat, 5 Jul 2014 22:41:04 +0000 (+0200) Subject: generalized RANSAC X-Git-Url: http://git.tomasm.cz/imago.git/commitdiff_plain/1e417ec51105662e1d1d7a7e2350dbe724f76a2d?hp=b92613882c83f64e0c513af1facc262fb4915e54 generalized RANSAC --- diff --git a/src/gridf3.py b/src/gridf3.py index 693b8ee..5852115 100644 --- a/src/gridf3.py +++ b/src/gridf3.py @@ -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) diff --git a/src/linef.py b/src/linef.py index ab7c95d..2b2b86b 100644 --- a/src/linef.py +++ b/src/linef.py @@ -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 diff --git a/src/ransac.py b/src/ransac.py index cc16d2f..6557ea4 100644 --- a/src/ransac.py +++ b/src/ransac.py @@ -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 - - -