Ejemplo n.º 1
0
def centers_to_responses(centers: List[Point],
                         response_codes: List[ResponseCode],
                         aligned_response_codes: Image) -> List[ResponseCode]:
    DISTANCE_THRESH = 35
    SPLIT_DIST_THRESH = 5

    selected_responses = []
    for center in centers:
        (closest_code, closest_dist) = None, 9999999
        (second_code, second_dist) = None, 9999999
        for code in response_codes:
            if utils.__DEBUG__:
                cv2.circle(aligned_response_codes.raw_image,
                           code.coords.to_tuple(),
                           4, (255, 0, 0),
                           thickness=3)

            dist = center.calc_distance(code.coords)

            if dist < DISTANCE_THRESH:
                if dist < closest_dist:
                    closest_code = code
                    closest_dist = dist
                elif dist < DISTANCE_THRESH:
                    second_code = code
                    second_dist = dist

        # The case of only appending the closest point.
        if (closest_code and not second_code) or \
           (closest_code and second_code and (second_dist - closest_dist > SPLIT_DIST_THRESH)):
            selected_responses.append(closest_code)
        # The split is too close to call, add both closest responses.
        elif (closest_code and second_code
              and (second_dist - closest_dist <= SPLIT_DIST_THRESH)):
            selected_responses.append(closest_code)
            selected_responses.append(second_code)

    if utils.__DEBUG__:
        aligned_response_codes.show()
    return selected_responses