diff --git a/src/openflexure_microscope_server/things/camera/__init__.py b/src/openflexure_microscope_server/things/camera/__init__.py index 6c5652bd..31cfe0e3 100644 --- a/src/openflexure_microscope_server/things/camera/__init__.py +++ b/src/openflexure_microscope_server/things/camera/__init__.py @@ -250,6 +250,7 @@ class BaseCamera(Thing): try: image.save(jpeg_path, quality=95, subsampling=0) try: + # Load EXIF metadata from image so it can be added to. exif_dict = piexif.load(jpeg_path) exif_dict["Exif"][piexif.ExifIFD.UserComment] = json.dumps( metadata diff --git a/src/openflexure_microscope_server/things/camera/picamera.py b/src/openflexure_microscope_server/things/camera/picamera.py index 991f9381..24fa2f94 100644 --- a/src/openflexure_microscope_server/things/camera/picamera.py +++ b/src/openflexure_microscope_server/things/camera/picamera.py @@ -152,7 +152,7 @@ class StreamingPiCamera2(BaseCamera): tolerance of current value. This allows ignoring small changes """ if key not in self.persistent_control_tolerances: - # Not tolerance range set, so it is not within tollerance + # Not tolerance range set, so it is not within tolerance return False difference = np.abs(self.persistent_controls[key] - value) @@ -419,7 +419,7 @@ class StreamingPiCamera2(BaseCamera): ) @thing_action - def stop_streaming(self, stop_web_stream=True) -> None: + def stop_streaming(self, stop_web_stream: bool = True) -> None: """ Stop the MJPEG stream """ @@ -617,7 +617,7 @@ class StreamingPiCamera2(BaseCamera): self.update_persistent_controls() @thing_action - def calibrate_lens_shading(self): + def calibrate_lens_shading(self) -> None: """Take an image and use it for flat-field correction. This method requires an empty (i.e. bright) field of view. It will take @@ -643,7 +643,7 @@ class StreamingPiCamera2(BaseCamera): ) @colour_correction_matrix.setter # type: ignore - def colour_correction_matrix(self, value): + def colour_correction_matrix(self, value) -> None: self.thing_settings["colour_correction_matrix"] = value self.calibrate_colour_correction(value) @@ -664,14 +664,14 @@ class StreamingPiCamera2(BaseCamera): self.colour_correction_matrix = c @thing_action - def calibrate_colour_correction(self, c: tuple): + def calibrate_colour_correction(self, c: tuple) -> None: """Overwrite the colour correction matrix in camera tuning""" with self.picamera(pause_stream=True): recalibrate_utils.set_static_ccm(self.tuning, c) self.initialise_picamera() @thing_action - def set_static_green_equalisation(self, offset: int = 65535): + def set_static_green_equalisation(self, offset: int = 65535) -> None: """Set the green equalisation to a static value. Green equalisation avoids the debayering algorithm becoming confused @@ -686,7 +686,7 @@ class StreamingPiCamera2(BaseCamera): self.initialise_picamera() @thing_action - def full_auto_calibrate(self): + def full_auto_calibrate(self) -> None: """Perform a full auto-calibration This function will call the other calibration actions in sequence: @@ -704,7 +704,7 @@ class StreamingPiCamera2(BaseCamera): self.calibrate_white_balance() @thing_action - def flat_lens_shading(self): + def flat_lens_shading(self) -> None: """Disable flat-field correction This method will set a completely flat lens shading table. It is not the @@ -786,7 +786,7 @@ class StreamingPiCamera2(BaseCamera): ) @thing_action - def flat_lens_shading_chrominance(self): + def flat_lens_shading_chrominance(self) -> None: """Disable flat-field correction This method will set the chrominance of the lens shading table to be @@ -801,7 +801,7 @@ class StreamingPiCamera2(BaseCamera): self.initialise_picamera() @thing_action - def reset_lens_shading(self): + def reset_lens_shading(self) -> None: """Revert to default lens shading settings This method will restore the default "adaptive" lens shading method used diff --git a/src/openflexure_microscope_server/things/camera/picamera_recalibrate_utils.py b/src/openflexure_microscope_server/things/camera/picamera_recalibrate_utils.py index 4f4d5224..d3073f75 100644 --- a/src/openflexure_microscope_server/things/camera/picamera_recalibrate_utils.py +++ b/src/openflexure_microscope_server/things/camera/picamera_recalibrate_utils.py @@ -69,13 +69,13 @@ def load_default_tuning(cam: Picamera2) -> dict: tuning_dir = "/usr/share/libcamera/ipa/raspberrypi" # from picamera2 v0.3.9 # The directory above has been removed from the search path seems - # find odd - as that's where the files currently are on a default + # odd - as that's where the files currently are on a default # Raspbian image. This may need updating if the files have moved # in future updates to the system libcamera package return cam.load_tuning_file(fname, dir=tuning_dir) -def set_minimum_exposure(camera: Picamera2): +def set_minimum_exposure(camera: Picamera2) -> None: """Enable manual exposure, with low gain and shutter speed We set exposure mode to manual, analog and digital gain @@ -135,7 +135,7 @@ def test_exposure_settings(camera: Picamera2, percentile: float) -> ExposureTest return result -def check_convergence(test: ExposureTest, target: int, tolerance: float): +def check_convergence(test: ExposureTest, target: int, tolerance: float) -> bool: """Check whether the brightness is within the specified target range""" return abs(test.level - target) < target * tolerance @@ -222,7 +222,7 @@ def adjust_shutter_and_gain_from_raw( # Check the gain is still changing - if not, we have probably hit the maximum if camera.capture_metadata()["AnalogueGain"] == test.analog_gain: - logging.info(f"Gain has maxed out. at {test.analog_gain}") + logging.info(f"Gain has maxed out at {test.analog_gain}") break if check_convergence(test, target_white_level, tolerance): @@ -504,7 +504,7 @@ def index_of_algorithm(algorithms: list[dict], algorithm: str) -> int: raise ValueError(f"Algorithm {algorithm} is not available.") -def copy_alsc_section(from_tuning: dict, to_tuning: dict): +def copy_alsc_section(from_tuning: dict, to_tuning: dict) -> None: """Copy the `rpi.alsc` algorithm from one tuning to another. This is done in-place, i.e. modifying to_tuning. @@ -544,7 +544,7 @@ def raw_channels_from_camera(camera: Picamera2) -> LensShadingTables: return channels_from_bayer_array(raw_image) -def recreate_camera_manager(): +def recreate_camera_manager() -> None: """Delete and recreate the camera manager. This is necessary to ensure the tuning file is re-read.