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