From: Tomas Musil Date: Sun, 14 Oct 2012 15:21:33 +0000 (+0200) Subject: better manual mode, grid-fitting preparation X-Git-Url: http://git.tomasm.cz/imago.git/commitdiff_plain/f6002686fef1bd826f3a1777998416b93d909d56?hp=b1b5232a3561e92a40a26ff586ee3496b080692c better manual mode, grid-fitting preparation --- diff --git a/gridf.py b/gridf.py new file mode 100644 index 0000000..c8f4b90 --- /dev/null +++ b/gridf.py @@ -0,0 +1,8 @@ +from manual import lines as g_grid, l2ad +from intrsc import intersections_from_angl_dist + +def find(lines, size, l1, l2): + c = intersections_from_angl_dist(lines, size) + corners = [c[0][0], c[0][-1], c[-1][0], c[-1][-1]] + grid = g_grid(corners) + return grid diff --git a/imago.py b/imago.py index c053a7f..1e5166c 100755 --- a/imago.py +++ b/imago.py @@ -17,6 +17,7 @@ import im_debug import linef import manual import intrsc +import gridf def main(): """Main function of the program.""" @@ -52,7 +53,7 @@ def main(): image.size[1])), Image.ANTIALIAS) do_something = im_debug.show if args.saving: - do_something = imsave("saved/" + args.file[0][:-4] + "_" + + do_something = imsave("saved/" + args.files[0][:-4] + "_" + str(image.size[0]) + "/").save if args.manual_mode: @@ -63,6 +64,13 @@ def main(): return 1 else: lines = linef.find_lines(image, show_all, do_something, verbose) + grid = gridf.find(lines, image.size, None, None) + if show_all: + im_g = image.copy() + draw = ImageDraw.Draw(im_g) + for l in grid[0] + grid[1]: + draw.line(l, fill=(64, 255, 64), width=1) + do_something(im_g) board = intrsc.board(image, lines, show_all, do_something) diff --git a/linef.py b/linef.py index fbd1368..34c4d07 100755 --- a/linef.py +++ b/linef.py @@ -105,7 +105,7 @@ def find_lines(image, show_all, do_something, verbose): for line in [l for s in lines for l in s]: draw.line(line_from_angl_dist(line, image.size), fill=(120, 255, 120)) if show_all: - do_something(image_g, "the grid") + do_something(image_g, "lines") return lines diff --git a/manual.py b/manual.py index 55dfdd0..1d06035 100644 --- a/manual.py +++ b/manual.py @@ -2,7 +2,7 @@ import pygame import Image, ImageDraw -from math import atan, sin, cos, pi +from math import atan, sin, cos, pi, sqrt, acos, copysign class UserQuitError(Exception): pass @@ -72,8 +72,12 @@ def find_lines(im_orig): clock.tick(15) def lines(corners): - cor_d = sorted([(corners[0][0] * c[1] - c[0] * corners[0][1], c) for c in - corners[1:]]) + #TODO Error on triangle + cor_d = [(corners[0], (c[0] - corners[0][0], c[1] - corners[0][1]), c) for c in + 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]) corners = [corners[0]] + [c for _, c in cor_d] return (_lines(corners, 0) + [(corners[0], corners[3]), (corners[1], corners[2])], @@ -89,8 +93,14 @@ def _lines(corners, n): x = half_line(corners) c = intersection(line(x[0], corners[2]), line(corners[1], corners[3])) d = intersection(line(corners[0], corners[3]), line(corners[1], corners[2])) - l = (intersection(line(corners[0], corners[1]), line(c,d)), - intersection(line(corners[2], corners[3]), line(c,d))) + if d: + l = (intersection(line(corners[0], corners[1]), line(c,d)), + intersection(line(corners[2], corners[3]), line(c,d))) + else: + lx = line(c, (c[0] + corners[0][0] - corners[3][0], + c[1] + corners[0][1] - corners[3][1])) + l = (intersection(line(corners[0], corners[1]), lx), + intersection(line(corners[2], corners[3]), lx)) l2 = half_line([corners[0], l[0], l[1], corners[3]]) if n == 1: return ([l, l2] + _lines([l[0], l2[0], l2[1], l[1]], 2)