[PATCH 2/2] utils: raspberrypi: ctt: Fix NaNs in chromatic aberration tables

Kieran Bingham kieran.bingham at ideasonboard.com
Mon Apr 28 15:47:38 CEST 2025


Quoting Naushir Patuck (2025-04-28 14:20:47)
> Hi David,
> 
> On Mon, 28 Apr 2025 at 11:36, David Plowman
> <david.plowman at raspberrypi.com> wrote:
> >
> > NaNs can appear if no black dots can be found and analysed in a
> > particular region of the calibration image. There needs to be at least
> > one such dot in every 8x8 cell covering the image.
> >
> > This is now detected, and an error message issued. No CAC tables are
> > generated, so CAC is disabled.
> >
> > Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
> 
> Reviewed-by: Naushir Patuck <naush at raspberrypi.com>

and another to make the CI happy ...

Acked-by: Kieran Bingham <kieran.bingham at ideasonboard.com>

> 
> > ---
> >  utils/raspberrypi/ctt/ctt.py     |  9 ++++++---
> >  utils/raspberrypi/ctt/ctt_cac.py | 32 +++++++++++++++++++++++++++-----
> >  2 files changed, 33 insertions(+), 8 deletions(-)
> >
> > diff --git a/utils/raspberrypi/ctt/ctt.py b/utils/raspberrypi/ctt/ctt.py
> > index 96f1b5e6..186afda5 100755
> > --- a/utils/raspberrypi/ctt/ctt.py
> > +++ b/utils/raspberrypi/ctt/ctt.py
> > @@ -198,9 +198,12 @@ class Camera:
> >          """
> >          Write output to json
> >          """
> > -        self.json['rpi.cac']['cac'] = cacs
> > -        self.log += '\nCAC calibration written to json file'
> > -        print('Finished CAC calibration')
> > +        if cacs:
> > +            self.json['rpi.cac']['cac'] = cacs
> > +            self.log += '\nCAC calibration written to json file'
> > +            print('Finished CAC calibration')
> > +        else:
> > +            self.log += "\nCAC calibration failed"
> >
> >
> >      """
> > diff --git a/utils/raspberrypi/ctt/ctt_cac.py b/utils/raspberrypi/ctt/ctt_cac.py
> > index 5a4c5101..a1183989 100644
> > --- a/utils/raspberrypi/ctt/ctt_cac.py
> > +++ b/utils/raspberrypi/ctt/ctt_cac.py
> > @@ -108,12 +108,29 @@ def shifts_to_yaml(red_shift, blue_shift, image_dimensions, output_grid_size=9):
> >          ybsgrid[xgridloc][ygridloc].append(blue_shift[3])
> >
> >      # Now calculate the average pixel shift for each square in the grid
> > +    grid_incomplete = False
> >      for x in range(output_grid_size - 1):
> >          for y in range(output_grid_size - 1):
> > -            xrgrid[x, y] = np.mean(xrsgrid[x][y])
> > -            yrgrid[x, y] = np.mean(yrsgrid[x][y])
> > -            xbgrid[x, y] = np.mean(xbsgrid[x][y])
> > -            ybgrid[x, y] = np.mean(ybsgrid[x][y])
> > +            if xrsgrid[x][y]:
> > +                xrgrid[x, y] = np.mean(xrsgrid[x][y])
> > +            else:
> > +                grid_incomplete = True
> > +            if yrsgrid[x][y]:
> > +                yrgrid[x, y] = np.mean(yrsgrid[x][y])
> > +            else:
> > +                grid_incomplete = True
> > +            if xbsgrid[x][y]:
> > +                xbgrid[x, y] = np.mean(xbsgrid[x][y])
> > +            else:
> > +                grid_incomplete = True
> > +            if ybsgrid[x][y]:
> > +                ybgrid[x, y] = np.mean(ybsgrid[x][y])
> > +            else:
> > +                grid_incomplete = True
> > +
> > +    if grid_incomplete:
> > +        raise RuntimeError("\nERROR: CAC measurements do not span the image!"
> > +                           "\nConsider using improved CAC images, or remove them entirely.\n")
> >
> >      # Next, we start to interpolate the central points of the grid that gets passed to the tuning file
> >      input_grids = np.array([xrgrid, yrgrid, xbgrid, ybgrid])
> > @@ -219,7 +236,12 @@ def cac(Cam):
> >      # tuning file
> >      print("\nCreating output grid")
> >      Cam.log += '\nCreating output grid'
> > -    rx, ry, bx, by = shifts_to_yaml(red_shift, blue_shift, image_size)
> > +    try:
> > +        rx, ry, bx, by = shifts_to_yaml(red_shift, blue_shift, image_size)
> > +    except RuntimeError as e:
> > +        print(str(e))
> > +        Cam.log += "\nCAC correction failed! CAC will not be enabled."
> > +        return {}
> >
> >      print("CAC correction complete!")
> >      Cam.log += '\nCAC correction complete!'
> > --
> > 2.34.1
> >


More information about the libcamera-devel mailing list