class GridFittingFailedError(Exception):
pass
+class BadGenError(Exception):
+ pass
+
def plot_line(line, c, size):
points = linef.line_from_angl_dist(line, size)
pyplot.plot(*zip(*points), color=c)
if l1[i] and l2[j]:
yield (l1[i], l2[j])
+ def remove(self, data):
+ self.data = list(set(self.data) - set(data))
+
def initial(self):
try:
- return self.gen.next()
+ nxt = self.gen.next()
except StopIteration:
self.gen = self.initial_g()
- return self.gen.next()
+ nxt = self.gen.next()
+ return nxt
def get(self, sample):
if len(sample) == 2:
score = 0
a, b, c = est
dst = lambda (x, y): abs(a * x + b * y + c) / sqrt(a*a+b*b)
+ l1 = None
+ l2 = None
for p in self.data:
d = dst(p)
if d <= dist:
cons.append(p)
+ if p.l1 == l1 or p.l2 == l2:
+ return float("inf"), []
+ else:
+ l1, l2 = p.l1, p.l2
score += min(d, dist)
+
return score, cons
def intersection((a1, b1, c1), (a2, b2, c2)):
d_file.close()
else:
lines, l1, l2, bounds, hough = linef.find_lines(image, do_something, logger)
+ #d_file = open('lines09.pickle', 'wb')
+ #pickle.dump(lines, d_file)
+ #d_file.close() #TODO delete this
+
grid, lines = gridf.find(lines, image.size, l1, l2, bounds, hough,
show_all, do_something, logger)
score = float("inf")
consensual = model.initial()
estimate = model.get(consensual)
- new_score, consensual = model.score(estimate, distance)
- while (new_score < score):
- score = new_score
- try:
- estimate = model.get(consensual)
- new_score, consensual = model.score(estimate, distance)
- except NP.linalg.LinAlgError:
- pass
+ new_score, new_consensual = model.score(estimate, distance)
+ if new_consensual != []:
+ while (new_score < score):
+ score, consensual = new_score, new_consensual
+ try:
+ estimate = model.get(consensual)
+ new_score, new_consensual = model.score(estimate, distance)
+ except (NP.linalg.LinAlgError):
+ pass
return score, estimate, consensual
-def estimate(data, dist, k, modelClass=Linear_model):
- model = modelClass(data)
+def estimate(data, dist, k, modelClass=Linear_model, model=None):
+ if not model:
+ model = modelClass(data)
best = float("inf")
estimate = None
consensual = None
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):
+ ests = []
+ cons = []
+ for i in xrange(m):
+ est, cons_new = estimate(None, dist, k, model=model)
+ model.remove(cons_new)
+ ests.append(est)
+ return ests
+
+
+