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.generators import YamlOutput
from libtuning.modules.lsc import LSCRkISP1 from libtuning.modules.lsc import LSCRkISP1
from libtuning.modules.agc import AGCRkISP1 from libtuning.modules.agc import AGCRkISP1
from libtuning.modules.ccm import CCMRkISP1
coloredlogs.install(level=logging.INFO, fmt='%(name)s %(levelname)s %(message)s') 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), smoothing_function=lt.smoothing.MedianBlur(3),
)) ))
tuner.add(AGCRkISP1(debug=[lt.Debug.Plot])) tuner.add(AGCRkISP1(debug=[lt.Debug.Plot]))
tuner.add(CCMRkISP1(debug=[lt.Debug.Plot]))
tuner.set_input_parser(YamlParser()) tuner.set_input_parser(YamlParser())
tuner.set_output_formatter(YamlOutput()) tuner.set_output_formatter(YamlOutput())
tuner.set_output_order([AGCRkISP1, LSCRkISP1]) tuner.set_output_order([AGCRkISP1, CCMRkISP1, LSCRkISP1])
if __name__ == '__main__': if __name__ == '__main__':
sys.exit(tuner.run(sys.argv)) sys.exit(tuner.run(sys.argv))