def generate_hand_ray(center_point, edge): center = sp.Point(center_point) first = sp.Point(edge[0:2]) second = sp.Point(edge[2:4]) first_dist = center.distance(first) second_dist = center.distance(second) return sp.Ray(first, second) if first_dist < second_dist else sp.Ray(second, first)
def calc_edge_compass_angle_no_modify(edge): north_ray = sympy.Ray((0, 0), (0, 1)) # 要算所有edge,所以不要反向。 edge_ray = sympy.Ray(*edge.getShape()[:2]) angle = north_ray.closing_angle(edge_ray) angle = (angle + 2 * sympy.pi) % (2 * sympy.pi) angle_degrees = float(degrees(angle)) # angle_radians = float(radians(degrees(angle))) # edge._angle_degrees = round(angle_degrees,4) # edge._angle_radians = round(angle_radians,4) return angle_degrees
def calc_edge_compass_angle(edge): north_ray = sympy.Ray((0, 0), (0, 1)) # 反向算进入edge,直观。 edge_ray = sympy.Ray(*edge.getShape()[:2][::-1]) angle = north_ray.closing_angle(edge_ray) angle = (angle + 2 * sympy.pi) % (2 * sympy.pi) angle_degrees = float(degrees(angle)) angle_radians = float(radians(degrees(angle))) edge._angle_degrees = round(angle_degrees, 4) edge._angle_radians = round(angle_radians, 4) return angle_degrees, angle_radians
def read_dial(config, idx, img): offset, clockwise = config offset_r = offset * (np.pi / 180) height, width = img.shape[:2] center = [width / 2, height / 2] radius = int(width / 2) circle = sp.Circle(sp.Point(center), radius) offset_ray = sp.Ray(sp.Point(center), angle=mp.radians(offset)) offset_img = img.copy() origin_point = [center[0], 0] offset_point = [ math.cos(offset_r) * (origin_point[0] - center[0]) - math.sin(offset_r) * (origin_point[1] - center[1]) + center[0], math.sin(offset_r) * (origin_point[0] - center[0]) + math.cos(offset_r) * (origin_point[1] - center[1]) + center[1] ] cv2.line(offset_img, (int(center[0]), int(center[1])), (int(offset_point[0]), int(offset_point[1])), (0, 255, 0), 2) write_debug(offset_img, f"dial-{idx}") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) blurred = cv2.GaussianBlur(gray, (5, 5), 0) write_debug(blurred, f"blurred-{idx}") edges = cv2.Canny(blurred, 50, 200) write_debug(edges, f"edges-{idx}") edge = find_hand_edge(edges) hand_edge_img = img.copy() cv2.line(hand_edge_img, (edge[0], edge[1]), (edge[2], edge[3]), (0, 255, 0), 2) write_debug(hand_edge_img, f"hand-edge-{idx}") hand_ray = generate_hand_ray(center, edge) circle_intersection = hand_ray.intersection(circle)[0] cv2.line(img, (int(center[0]), int(center[1])), (int(circle_intersection.x), int(circle_intersection.y)), (0, 0, 255), 2) write_debug(img, f"intersection-{idx}") angle_r = math.atan2(circle_intersection.y - center[1], circle_intersection.x - center[0]) - math.atan2( origin_point[1] - center[1], origin_point[0] - center[0]) angle = angle_r * 180 / np.pi if angle < 0: angle = 360 + angle angle_p = angle / 360 if not clockwise: angle_p = 1 - angle_p return int(10 * angle_p)
def __init__(self, args): ''' RayModified class note that "RayModified" is a subClass of "LineModified" but the self.obj is aggregated from sym.Ray ''' self.obj = sym.Ray(*args)