def test_invalid_connection(self): landmark_list = text_format.Parse( 'landmark {x: 0.5 y: 0.5} landmark {x: 0.2 y: 0.2}', landmark_pb2.NormalizedLandmarkList()) image = np.arange(27, dtype=np.uint8).reshape(3, 3, 3) with self.assertRaisesRegex(ValueError, 'Landmark index is out of range.'): drawing_utils.draw_landmarks(image, landmark_list, [(0, 2)])
def _convert_format( self, inputs: annotation_data_pb2.FrameAnnotation ) -> List[ObjectronOutputs]: new_outputs = list() for annotation in inputs.annotations: # Get 3d object pose. rotation = np.reshape(np.array(annotation.rotation), (3, 3)) translation = np.array(annotation.translation) scale = np.array(annotation.scale) # Get 2d/3d landmakrs. landmarks_2d = landmark_pb2.NormalizedLandmarkList() landmarks_3d = landmark_pb2.LandmarkList() for keypoint in annotation.keypoints: point_2d = keypoint.point_2d landmarks_2d.landmark.add(x=point_2d.x, y=point_2d.y) point_3d = keypoint.point_3d landmarks_3d.landmark.add(x=point_3d.x, y=point_3d.y, z=point_3d.z) # Add to objectron outputs. new_outputs.append( ObjectronOutputs(landmarks_2d, landmarks_3d, rotation, translation, scale=scale)) return new_outputs
def test_drawing_spec(self): landmark_list = text_format.Parse( 'landmark {x: 0.1 y: 0.1}' 'landmark {x: 0.8 y: 0.8}', landmark_pb2.NormalizedLandmarkList()) image = np.zeros((100, 100, 3), np.uint8) landmark_drawing_spec = drawing_utils.DrawingSpec( color=(0, 0, 255), thickness=5) connection_drawing_spec = drawing_utils.DrawingSpec( color=(255, 0, 0), thickness=3) expected_result = np.copy(image) start_point = (10, 10) end_point = (80, 80) cv2.line(expected_result, start_point, end_point, connection_drawing_spec.color, connection_drawing_spec.thickness) cv2.circle(expected_result, start_point, landmark_drawing_spec.circle_radius, landmark_drawing_spec.color, landmark_drawing_spec.thickness) cv2.circle(expected_result, end_point, landmark_drawing_spec.circle_radius, landmark_drawing_spec.color, landmark_drawing_spec.thickness) drawing_utils.draw_landmarks( image=image, landmark_list=landmark_list, connections=[(0, 1)], landmark_drawing_spec=landmark_drawing_spec, connection_drawing_spec=connection_drawing_spec) np.testing.assert_array_equal(image, expected_result)
def test_min_and_max_coordinate_values(self): landmark_list = text_format.Parse( 'landmark {x: 0.0 y: 1.0}' 'landmark {x: 1.0 y: 0.0}', landmark_pb2.NormalizedLandmarkList()) image = np.zeros((100, 100, 3), np.uint8) expected_result = np.copy(image) start_point = (0, 99) end_point = (99, 0) cv2.line(expected_result, start_point, end_point, DEFAULT_CONNECTION_DRAWING_SPEC.color, DEFAULT_CONNECTION_DRAWING_SPEC.thickness) cv2.circle(expected_result, start_point, DEFAULT_CIRCLE_DRAWING_SPEC.circle_radius + 1, DEFAULT_CYCLE_BORDER_COLOR, DEFAULT_CIRCLE_DRAWING_SPEC.thickness) cv2.circle(expected_result, end_point, DEFAULT_CIRCLE_DRAWING_SPEC.circle_radius + 1, DEFAULT_CYCLE_BORDER_COLOR, DEFAULT_CIRCLE_DRAWING_SPEC.thickness) cv2.circle(expected_result, start_point, DEFAULT_CIRCLE_DRAWING_SPEC.circle_radius, DEFAULT_CIRCLE_DRAWING_SPEC.color, DEFAULT_CIRCLE_DRAWING_SPEC.thickness) cv2.circle(expected_result, end_point, DEFAULT_CIRCLE_DRAWING_SPEC.circle_radius, DEFAULT_CIRCLE_DRAWING_SPEC.color, DEFAULT_CIRCLE_DRAWING_SPEC.thickness) drawing_utils.draw_landmarks(image=image, landmark_list=landmark_list, connections=[(0, 1)]) np.testing.assert_array_equal(image, expected_result)
def test_draw_landmarks_and_connections(self, landmark_list_text): landmark_list = text_format.Parse( landmark_list_text, landmark_pb2.NormalizedLandmarkList()) image = np.zeros((100, 100, 3), np.uint8) expected_result = np.copy(image) start_point = (10, 50) end_point = (50, 10) cv2.line(expected_result, start_point, end_point, DEFAULT_CONNECTION_DRAWING_SPEC.color, DEFAULT_CONNECTION_DRAWING_SPEC.thickness) cv2.circle(expected_result, start_point, DEFAULT_CIRCLE_DRAWING_SPEC.circle_radius + 1, DEFAULT_CYCLE_BORDER_COLOR, DEFAULT_CIRCLE_DRAWING_SPEC.thickness) cv2.circle(expected_result, end_point, DEFAULT_CIRCLE_DRAWING_SPEC.circle_radius + 1, DEFAULT_CYCLE_BORDER_COLOR, DEFAULT_CIRCLE_DRAWING_SPEC.thickness) cv2.circle(expected_result, start_point, DEFAULT_CIRCLE_DRAWING_SPEC.circle_radius, DEFAULT_CIRCLE_DRAWING_SPEC.color, DEFAULT_CIRCLE_DRAWING_SPEC.thickness) cv2.circle(expected_result, end_point, DEFAULT_CIRCLE_DRAWING_SPEC.circle_radius, DEFAULT_CIRCLE_DRAWING_SPEC.color, DEFAULT_CIRCLE_DRAWING_SPEC.thickness) drawing_utils.draw_landmarks(image=image, landmark_list=landmark_list, connections=[(0, 1)]) np.testing.assert_array_equal(image, expected_result)
def test_draw_single_landmark_point(self, landmark_list_text): landmark_list = text_format.Parse(landmark_list_text, landmark_pb2.NormalizedLandmarkList()) image = np.zeros((100, 100, 3), np.uint8) expected_result = np.copy(image) cv2.circle(expected_result, (10, 10), DEFAULT_CIRCLE_DRAWING_SPEC.circle_radius, DEFAULT_CIRCLE_DRAWING_SPEC.color, DEFAULT_CIRCLE_DRAWING_SPEC.thickness) drawing_utils.draw_landmarks(image, landmark_list) np.testing.assert_array_equal(image, expected_result)
def test_invalid_input_image(self): image = np.arange(18, dtype=np.uint8).reshape(3, 3, 2) with self.assertRaisesRegex( ValueError, 'Input image must contain three channel rgb data.'): drawing_utils.draw_landmarks(image, landmark_pb2.NormalizedLandmarkList()) with self.assertRaisesRegex( ValueError, 'Input image must contain three channel rgb data.'): drawing_utils.draw_detection(image, detection_pb2.Detection())