[libcamera-devel] [PATCH 2/3] utils: raspberrypi: ctt: Add alsc_only method
Naushir Patuck
naush at raspberrypi.com
Mon Jul 11 11:40:20 CEST 2022
Hi William,
Thank you for your work.
On Wed, 6 Jul 2022 at 11:18, David Plowman via libcamera-devel <
libcamera-devel at lists.libcamera.org> wrote:
> From: William Vinnicombe <william.vinnicombe at raspberrypi.com>
>
> The ctt would not work if only passed alsc images.
>
> Added alsc_only.py to run alsc calibration only, and modified check_imgs
> to allow for no macbeth chart images.
>
> Example usage would be ./alsc_only.py -i tuning-images/ -o sensor.json
> with the same optional arguments as the original ctt.
>
> Signed-off-by: William Vinnicombe <william.vinnicombe at raspberrypi.com>
>
Reviewed-by: Naushir Patuck <naush at raspberrypi.com>
> ---
> utils/raspberrypi/ctt/alsc_only.py | 118 +++++++++++++++++++++++++++++
> utils/raspberrypi/ctt/ctt.py | 8 +-
> 2 files changed, 124 insertions(+), 2 deletions(-)
> create mode 100755 utils/raspberrypi/ctt/alsc_only.py
>
> diff --git a/utils/raspberrypi/ctt/alsc_only.py
> b/utils/raspberrypi/ctt/alsc_only.py
> new file mode 100755
> index 00000000..318adc8c
> --- /dev/null
> +++ b/utils/raspberrypi/ctt/alsc_only.py
> @@ -0,0 +1,118 @@
> +#!/usr/bin/env python3
> +#
> +# SPDX-License-Identifier: BSD-2-Clause
> +#
> +# Copyright (C) 2022, Raspberry Pi (Trading) Limited
> +#
> +# alsc_only.py - alsc tuning tool
> +
> +from ctt import *
> +
> +
> +def run_alsc(json_output, directory, config, log_output):
> + """
> + check input files are jsons
> + """
> + if json_output[-5:] != '.json':
> + raise ArgError('\n\nError: Output must be a json file!')
> + if config is not None:
> + """
> + check if config file is actually a json
> + """
> + if config[-5:] != '.json':
> + raise ArgError('\n\nError: Config file must be a json file!')
> + """
> + read configurations
> + """
> + try:
> + with open(config, 'r') as config_json:
> + configs = json.load(config_json)
> + except FileNotFoundError:
> + configs = {}
> + config = False
> + except json.decoder.JSONDecodeError:
> + configs = {}
> + config = True
> +
> + else:
> + configs = {}
> + """
> + load configurations from config file, if not given then set default
> + only load configurations needed for alsc, and directly define others
> + """
> + plot = get_config(configs, "plot", [], 'list')
> + alsc_d = get_config(configs, "alsc", {}, 'dict')
> + do_alsc_colour = get_config(alsc_d, "do_alsc_colour", 1, 'bool')
> + luminance_strength = get_config(alsc_d, "luminance_strength", 0.5,
> 'num')
> + blacklevel = get_config(configs, "blacklevel", -1, 'num')
> + mac_config = (0, 0)
> +
> + if blacklevel < -1 or blacklevel >= 2**16:
> + print('\nInvalid blacklevel, defaulted to 64')
> + blacklevel = -1
> +
> + if luminance_strength < 0 or luminance_strength > 1:
> + print('\nInvalid luminance_strength strength, defaulted to 0.5')
> + luminance_strength = 0.5
> +
> + """
> + sanitise directory path
> + """
> + if directory[-1] != '/':
> + directory += '/'
> + """
> + initialise tuning tool and load images
> + """
> + try:
> + Cam = Camera(json_output)
> + Cam.log_user_input(json_output, directory, config, log_output)
> + disable = set(Cam.json.keys()).symmetric_difference({"rpi.alsc"})
> + Cam.disable = disable
> + Cam.plot = plot
> + Cam.add_imgs(directory, mac_config, blacklevel)
> + except FileNotFoundError:
> + raise ArgError('\n\nError: Input image directory not found!')
> +
> + """
> + preform calibrations as long as check_imgs returns True
> + Only performs the alsc calibration
> + """
> + if Cam.check_imgs(macbeth=False):
> + Cam.json_remove(disable)
> + print('\nSTARTING CALIBRATIONS')
> + Cam.alsc_cal(luminance_strength, do_alsc_colour)
> + print('\nFINISHED CALIBRATIONS')
> + Cam.write_json()
> + Cam.write_log(log_output)
> + print('\nCalibrations written to: '+json_output)
> + if log_output is None:
> + log_output = 'ctt_log.txt'
> + print('Log file written to: '+log_output)
> + pass
> + else:
> + Cam.write_log(log_output)
> +
> +
> +if __name__ == '__main__':
> + """
> + initialise calibration
> + """
> + if len(sys.argv) == 1:
> + print("""
> + Pisp Camera Tuning Tool version 1.0
> +
> + Required Arguments:
> + '-i' : Calibration image directory.
> + '-o' : Name of output json file.
> +
> + Optional Arguments:
> + '-c' : Config file for the CTT. If not passed, default parameters
> used.
> + '-l' : Name of output log file. If not passed, 'ctt_log.txt' used.
> + """)
> + quit(0)
> + else:
> + """
> + parse input arguments
> + """
> + json_output, directory, config, log_output = parse_input()
> + run_alsc(json_output, directory, config, log_output)
> diff --git a/utils/raspberrypi/ctt/ctt.py b/utils/raspberrypi/ctt/ctt.py
> index 15064634..0ea4854d 100755
> --- a/utils/raspberrypi/ctt/ctt.py
> +++ b/utils/raspberrypi/ctt/ctt.py
> @@ -664,7 +664,7 @@ class Camera:
> - incorrect filename/extension
> - images from different cameras
> """
> - def check_imgs(self):
> + def check_imgs(self, macbeth=True):
> self.log += '\n\nImages found:'
> self.log += '\nMacbeth : {}'.format(len(self.imgs))
> self.log += '\nALSC : {} '.format(len(self.imgs_alsc))
> @@ -672,10 +672,14 @@ class Camera:
> """
> check usable images found
> """
> - if len(self.imgs) == 0:
> + if len(self.imgs) == 0 and macbeth:
> print('\nERROR: No usable macbeth chart images found')
> self.log += '\nERROR: No usable macbeth chart images found'
> return 0
> + elif len(self.imgs) == 0 and len(self.imgs_alsc) == 0:
> + print('\nERROR: No usable images found')
> + self.log += '\nERROR: No usable images found'
> + return 0
> """
> Double check that every image has come from the same camera...
> """
> --
> 2.30.2
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20220711/636d8672/attachment.htm>
More information about the libcamera-devel
mailing list