[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