def aspect_ratio(im, lines, D, v, O): vx, vy = v C0, C1 = C0_C1(lines, v) im_h, im_w = im.shape m = -(vx - O[0]) / (vy - O[1]) L0 = Line.from_point_slope(C0.first_base(), m) L1 = Line.from_point_slope(C1.first_base(), m) perp = L0.altitude(v) p0, p1 = L0.intersect(perp), L1.intersect(perp) h_img = norm(p0 - p1) L = Line(m, -m * O[0] - (f**2) / (vy - O[1])) F = L.altitude(v).intersect(L) _, x0r, y0r, w0r, h0r = lines[-1][-1] p0r = np.array([x0r + w0r / 2.0, y0r + h0r]) F_C0r = Line.from_points(F, p0r) q0 = F_C0r.intersect(L0) l_img = norm(q0 - p0) debug = cv2.cvtColor(im, cv2.COLOR_GRAY2BGR) L0.draw(debug) L1.draw(debug) L.draw(debug, color=GREEN) F_C0r.draw(debug, color=RED) lib.debug_imwrite('aspect.png', debug) # Convergence line perp to V=(vx, vy, f) # y = -vx / vy * x + -f^2 / vy alpha = atan2(norm(p1 - O), f) theta = acos(f / sqrt((vx - O[0])**2 + (vy - O[1])**2 + f**2)) beta = pi / 2 - theta lp_img = abs(D[0][-1] - D[0][0]) wp_img = norm(np.diff(D.T, axis=0), axis=1).sum() print('h_img:', h_img, 'l\'_img:', lp_img, 'alpha:', alpha) print('l_img:', l_img, 'w\'_img:', wp_img, 'beta:', beta) r = h_img * lp_img * cos(alpha) / (l_img * wp_img * cos(alpha + beta)) return r
def vanishing_point(lines, v0, O): C0 = lines[-1] if v0[1] < 0 else lines[0] others = lines[:-1] if v0[1] < 0 else lines[1:] domain = np.linspace(C0.left(), C0.right(), N_LONGS + 2)[1:-1] C0_points = np.array([domain, C0.model(domain)]).T longitudes = [Line.from_points(v0, p) for p in C0_points] lefts = [longitudes[0].text_line_intersect(line)[0] for line in others] rights = [longitudes[-1].text_line_intersect(line)[0] for line in others] valid_mask = [line.left() <= L and R < line.right() \ for line, L, R in zip(others, lefts, rights)] valid_lines = [C0] + compress(others, valid_mask) derivs = [line.model.deriv() for line in valid_lines] print('valid lines:', len(others)) convergences = [] for longitude in longitudes: intersects = [ longitude.text_line_intersect(line) for line in valid_lines ] tangents = [Line.from_point_slope(p, d(p[0])) \ for p, d in zip(intersects, derivs)] convergences.append(Line.best_intersection(tangents)) # x vx + y vy + f^2 = 0 # m = -vx / vy # b = -f^2 / vy L = Line.fit(convergences) # shift into O-origin coords L_O = L.offset(-O) vy = -(f**2) / L_O.b vx = -vy * L_O.m v = np.array((vx, vy)) + O debug = cv2.cvtColor(bw, cv2.COLOR_GRAY2BGR) for t in tangents: t.draw(debug, color=RED) for longitude in longitudes: longitude.draw(debug) L.draw(debug, color=GREEN) lib.debug_imwrite('vanish.png', debug) return v, f, L