libtuning: modules: Add initial CCM module

Implement a minimal ccm calibration module. For now it doesn't take the
results from lsc into account and supports rkisp1 only.

Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>
This commit is contained in:
Paul Elder 2024-05-30 04:42:50 +09:00 committed by Stefan Klug
parent 64d4e596a4
commit 721b976928
4 changed files with 78 additions and 1 deletions

View file

@ -0,0 +1,6 @@
# SPDX-License-Identifier: GPL-2.0-or-later
#
# Copyright (C) 2024, Paul Elder <paul.elder@ideasonboard.com>
from libtuning.modules.ccm.ccm import CCM
from libtuning.modules.ccm.rkisp1 import CCMRkISP1

View file

@ -0,0 +1,41 @@
# SPDX-License-Identifier: GPL-2.0-or-later
#
# Copyright (C) 2024, Paul Elder <paul.elder@ideasonboard.com>
# Copyright (C) 2024, Ideas on Board
#
# Base Ccm tuning module
from ..module import Module
from libtuning.ctt_ccm import ccm
import logging
logger = logging.getLogger(__name__)
class CCM(Module):
type = 'ccm'
hr_name = 'CCM (Base)'
out_name = 'GenericCCM'
def __init__(self, debug: list):
super().__init__()
self.debug = debug
def do_calibration(self, images):
logger.info('Starting CCM calibration')
imgs = [img for img in images if img.macbeth is not None]
# todo: Take LSC calibration results into account.
cal_cr_list = None
cal_cb_list = None
try:
ccms = ccm(imgs, cal_cr_list, cal_cb_list)
except ArithmeticError:
logger.error('CCM calibration failed')
return None
return ccms

View file

@ -0,0 +1,28 @@
# SPDX-License-Identifier: GPL-2.0-or-later
#
# Copyright (C) 2024, Paul Elder <paul.elder@ideasonboard.com>
# Copyright (C) 2024, Ideas on Board
#
# Ccm module for tuning rkisp1
from .ccm import CCM
class CCMRkISP1(CCM):
hr_name = 'Crosstalk Correction (RkISP1)'
out_name = 'Ccm'
def __init__(self, **kwargs):
super().__init__(**kwargs)
# We don't need anything from the config file.
def validate_config(self, config: dict) -> bool:
return True
def process(self, config: dict, images: list, outputs: dict) -> dict:
output = {}
ccms = self.do_calibration(images)
output['ccms'] = ccms
return output

View file

@ -14,6 +14,7 @@ from libtuning.parsers import YamlParser
from libtuning.generators import YamlOutput
from libtuning.modules.lsc import LSCRkISP1
from libtuning.modules.agc import AGCRkISP1
from libtuning.modules.ccm import CCMRkISP1
coloredlogs.install(level=logging.INFO, fmt='%(name)s %(levelname)s %(message)s')
@ -39,9 +40,10 @@ tuner.add(LSCRkISP1(
smoothing_function=lt.smoothing.MedianBlur(3),
))
tuner.add(AGCRkISP1(debug=[lt.Debug.Plot]))
tuner.add(CCMRkISP1(debug=[lt.Debug.Plot]))
tuner.set_input_parser(YamlParser())
tuner.set_output_formatter(YamlOutput())
tuner.set_output_order([AGCRkISP1, LSCRkISP1])
tuner.set_output_order([AGCRkISP1, CCMRkISP1, LSCRkISP1])
if __name__ == '__main__':
sys.exit(tuner.run(sys.argv))