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