From 9061c1dd45bc2250575f3281490ea41035733544 Mon Sep 17 00:00:00 2001 From: Lian Hui Lui Date: Sat, 23 Jul 2022 19:05:52 +0630 Subject: [PATCH] allow bounding box rectangle of face detection to go out of bounds --- mediapipe/python/solutions/drawing_utils.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/mediapipe/python/solutions/drawing_utils.py b/mediapipe/python/solutions/drawing_utils.py index bebcbe97c..e75ae5265 100644 --- a/mediapipe/python/solutions/drawing_utils.py +++ b/mediapipe/python/solutions/drawing_utils.py @@ -59,7 +59,6 @@ def _normalized_to_pixel_coordinates( if not (is_valid_normalized_value(normalized_x) and is_valid_normalized_value(normalized_y)): - # TODO: Draw coordinates even if it's outside of the image bounds. return None x_px = min(math.floor(normalized_x * image_width), image_width - 1) y_px = min(math.floor(normalized_y * image_height), image_height - 1) @@ -86,6 +85,20 @@ def draw_detection( a) If the input image is not three channel BGR. b) If the location data is not relative data. """ + + def _normalized_to_pixel_coordinates_unsafe( + normalized_x: float, normalized_y: float, image_width: int, + image_height: int) -> Tuple[int, int]: + """Converts normalized coordinates to pixel coordinates. + Normalized coordinates can be out of image bounds, therefore the result + may also be outside image bounds.""" + + x_px = math.floor(normalized_x * image_width) + y_px = math.floor(normalized_y * image_height) + + return x_px, y_px + + if not detection.location_data: return if image.shape[2] != _BGR_CHANNELS: @@ -98,7 +111,7 @@ def draw_detection( 'LocationData must be relative for this drawing funtion to work.') # Draws keypoints. for keypoint in location.relative_keypoints: - keypoint_px = _normalized_to_pixel_coordinates(keypoint.x, keypoint.y, + keypoint_px = _normalized_to_pixel_coordinates_unsafe(keypoint.x, keypoint.y, image_cols, image_rows) cv2.circle(image, keypoint_px, keypoint_drawing_spec.circle_radius, keypoint_drawing_spec.color, keypoint_drawing_spec.thickness) @@ -106,10 +119,10 @@ def draw_detection( if not location.HasField('relative_bounding_box'): return relative_bounding_box = location.relative_bounding_box - rect_start_point = _normalized_to_pixel_coordinates( + rect_start_point = _normalized_to_pixel_coordinates_unsafe( relative_bounding_box.xmin, relative_bounding_box.ymin, image_cols, image_rows) - rect_end_point = _normalized_to_pixel_coordinates( + rect_end_point = _normalized_to_pixel_coordinates_unsafe( relative_bounding_box.xmin + relative_bounding_box.width, relative_bounding_box.ymin + relative_bounding_box.height, image_cols, image_rows)