From: Tomas Musil Date: Thu, 29 Nov 2012 02:16:24 +0000 (+0100) Subject: better grid-fitting X-Git-Url: http://git.tomasm.cz/imago.git/commitdiff_plain/3a843a5f148dd7728130b33ef406c0de08cb4dcc?hp=c98a7fb2507b7ba3ee5f539bb6a7e356000a7f9c better grid-fitting --- diff --git a/gridf.py b/gridf.py index dcffd92..0c5b68f 100644 --- a/gridf.py +++ b/gridf.py @@ -1,7 +1,6 @@ """Imago grid-fitting module""" import multiprocessing -import itertools import Image, ImageDraw, ImageFilter @@ -38,6 +37,16 @@ def job_br2(args): get_grid([v1, v2], [h1, h2], size), size), x, y) +def job_4(args): + im_l, v1, v2, h1, h2, x, y, w, z, dv, dh, size = args + v1 = (v1[0] + x * dv, v1[1] + x) + v2 = (v2[0] + y * dv, v2[1] + y) + h1 = (h1[0] + w * dh, h1[1] + w) + h2 = (h2[0] + z * dh, h2[1] + z) + return (distance(im_l, + get_grid([v1, v2], [h1, h2], size), + size), x, y, w, z) + def find(lines, size, l1, l2, bounds, hough, do_something, im_h): l1 = line_from_angl_dist(l1, size) l2 = line_from_angl_dist(l2, size) @@ -64,18 +73,36 @@ def find(lines, size, l1, l2, bounds, hough, do_something, im_h): #GaussianBlur is undocumented class, may not work in future versions of PIL im_l_s = im_l.tostring() - #let's try the bruteforce aproach: - k = 30 - + #let's try the ULTRA bruteforce aproach: pool = multiprocessing.Pool(None) - tasks = [(im_l_s, v1, v2, h1, h2, x, y, delta_v, delta_h, size) for (x, y) in - itertools.product(xrange(-k, k), xrange(-k, k))] + #import time + #start = time.time() - opt_v = pool.map(job_br1, tasks, 8) - opt_h = pool.map(job_br2, tasks, 8) - _, x_v, y_v = max(opt_v) - _, x_h, y_h = max(opt_h) + k = 30 + tasks = [(im_l_s, v1, v2, h1, h2, x, y, w, z, delta_v, delta_h, size) + for x in xrange(-k, k, 2) + for y in xrange(-k, k, 2) + for z in xrange(-k, k, 2) + for w in xrange(-k, k, 2)] + + opt = pool.map(job_4, tasks) + _, x_v, y_v, x_h, y_h = max(opt) + + v1 = (v1[0] + x_v * delta_v, v1[1] + x_v) + v2 = (v2[0] + y_v * delta_v, v2[1] + y_v) + h1 = (h1[0] + x_h * delta_h, h1[1] + x_h) + h2 = (h2[0] + y_h * delta_h, h2[1] + y_h) + + k = 5 + tasks = [(im_l_s, v1, v2, h1, h2, x, y, w, z, delta_v, delta_h, size) + for x in xrange(-k, k) + for y in xrange(-k, k) + for z in xrange(-k, k) + for w in xrange(-k, k)] + + opt = pool.map(job_4, tasks) + _, x_v, y_v, x_h, y_h = max(opt) v1 = (v1[0] + x_v * delta_v, v1[1] + x_v) v2 = (v2[0] + y_v * delta_v, v2[1] + y_v) @@ -89,6 +116,8 @@ def find(lines, size, l1, l2, bounds, hough, do_something, im_h): pool.terminate() pool.join() + #print time.time() - start + ### Show error surface # # from gridf_analyzer import error_surface diff --git a/manual.py b/manual.py index a4e94f7..cecca75 100644 --- a/manual.py +++ b/manual.py @@ -77,7 +77,7 @@ def lines(corners): corners[1:]] cor_d = [(float(a[0] * b[0] + a[1] * b[1]) / (sqrt(a[0] ** 2 + a[1] ** 2) * sqrt(b[0] **2 + b[1] ** 2)), a[0] * b[1] - b[0] * a[1], c) for a, b, c in cor_d] - cor_d = sorted([(copysign(acos(a), b), c) for a, b, c in cor_d]) + cor_d = sorted([(copysign(acos(min(a, 1)), b), c) for a, b, c in cor_d]) corners = [corners[0]] + [c for _, c in cor_d] return (_lines(corners, 0) + [(corners[0], corners[3]), (corners[1], corners[2])],