def __init__(self, camera_arm_control_service):
     self._gripper_detector = GripperDetector()
     self._playfield_detector = PlayfieldDetector()
     self._treasure_pickup_detector = TreasurePickupDetector()
     self._treasure_pickup_success_detector = TreasurePickupSuccessDetector()
     self._end_zone_treasure_detector = EndZoneTreasureDetector()
     self._camera_arm_control_service = camera_arm_control_service
class LocalWorldDetector(object):

    MAX_IMAGE_SIZE = Vector2(600, 800)

    def __init__(self, camera_arm_control_service):
        self._gripper_detector = GripperDetector()
        self._playfield_detector = PlayfieldDetector()
        self._treasure_pickup_detector = TreasurePickupDetector()
        self._treasure_pickup_success_detector = TreasurePickupSuccessDetector()
        self._end_zone_treasure_detector = EndZoneTreasureDetector()
        self._camera_arm_control_service = camera_arm_control_service

    def detect_objects(self, image, detection_mode, local_world_map):
        self._resize_image(image)
        local_world_descriptor = LocalWorldDescriptor()
        local_world_descriptor.reference_image = image
        if detection_mode != LocalWorldMapDetectionMode.NONE:
            self._execute_detection(image, detection_mode, local_world_descriptor, local_world_map)
        return local_world_descriptor

    def _execute_detection(self, image, detection_mode, local_world_descriptor, local_world_map):
        try:
            self._execute_detection_mode(image, detection_mode, local_world_descriptor, local_world_map)
        except DetectionError as e:
            Logger.get_instance().log(self, "Local World Detection Failed", LogEntryType.WARNING, error = e, blob_data = image)

    def _resize_image(self, image):
        if image.size > self.MAX_IMAGE_SIZE:
            image.resize(image.size.shrink_to_fit(self.MAX_IMAGE_SIZE))

    def _execute_detection_mode(self, image, detection_mode, local_world_descriptor, local_world_map):
        if detection_mode == LocalWorldMapDetectionMode.TREASURE_PICKUP_DETECTION:
            self._detect_pickup_treasures(image, local_world_descriptor)
        elif detection_mode == LocalWorldMapDetectionMode.TREASURE_PICKUP_SUCCESS_DETECTION:
            self._detect_treasure_pickup_success(image, local_world_descriptor, local_world_map)
        elif detection_mode == LocalWorldMapDetectionMode.END_ZONE_TREASURE_DETECTION:
            self._detect_end_zone_treasures(image, local_world_descriptor)

    def _detect_pickup_treasures(self, image, local_world_descriptor):
        local_world_descriptor.local_world_object_types = [LocalWorldObjectType.GRIPPER, LocalWorldObjectType.TREASURE]
        self._camera_arm_control_service.move_camera(TreasurePickupDetector.DETECTION_CAMERA_ANGLE)
        if self._camera_arm_control_service.movement_in_progress:
            return
        local_world_descriptor.gripper = self._gripper_detector.detect(image)
        if local_world_descriptor.gripper is not None:
            local_world_descriptor.treasures = self._treasure_pickup_detector.detect(image, local_world_descriptor.gripper)
        if len(local_world_descriptor.treasures) == 0:
            raise DetectionError("No treasure detected.")

    def _detect_treasure_pickup_success(self, image, local_world_descriptor, local_world_map):
        local_world_descriptor.local_world_object_types = [LocalWorldObjectType.TREASURE]
        self._camera_arm_control_service.move_camera(TreasurePickupSuccessDetector.DETECTION_CAMERA_ANGLE)
        if self._camera_arm_control_service.movement_in_progress:
            return
        if local_world_map.contains(LocalWorldObjectType.GRIPPER):
            local_world_descriptor.treasures = self._treasure_pickup_success_detector.detect(image, local_world_map.gripper)
        else:
            raise DetectionError("Gripper must be detected prior performing this operation.")

    def _detect_end_zone_treasures(self, image, local_world_descriptor):
        local_world_descriptor.local_world_object_types = [LocalWorldObjectType.PLAYFIELD, LocalWorldObjectType.TREASURE]
        self._camera_arm_control_service.move_camera_sequenced(EndZoneTreasureDetector.DETECTION_CAMERA_MOVEMENT_SEQUENCE)
        if self._camera_arm_control_service.movement_in_progress:
            return
        try:
            local_world_descriptor.playfield = self._playfield_detector.detect(image)
            if local_world_descriptor.playfield is not None:
                local_world_descriptor.treasures = self._end_zone_treasure_detector.detect(image, local_world_descriptor.playfield)
        except DetectionError as e:
            self._camera_arm_control_service.move_next()
            raise e