[libcamera-devel] [PATCH] ipa: raspberrypi: awb: Update colour temperature whenever manual gains change
Naushir Patuck
naush at raspberrypi.com
Fri Oct 28 12:53:00 CEST 2022
Hi David,
Thank you for this work.
On Thu, 27 Oct 2022 at 12:40, David Plowman via libcamera-devel <
libcamera-devel at lists.libcamera.org> wrote:
> Previously we only did this when the system starts (on the first
> switch_mode). Now we do it whenever the manual colour gains are
> updated. To facilitate this, this R/B vs. colour temperature inverse
> functions are stored persistently in the AwbConfig.
>
> Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
>
It's good to be consistent with this behavior.
Reviewed-by: Naushir Patuck <naush at raspberrypi.com>
> ---
> src/ipa/raspberrypi/controller/rpi/awb.cpp | 24 +++++++++-------------
> src/ipa/raspberrypi/controller/rpi/awb.h | 3 ++-
> 2 files changed, 12 insertions(+), 15 deletions(-)
>
> diff --git a/src/ipa/raspberrypi/controller/rpi/awb.cpp
> b/src/ipa/raspberrypi/controller/rpi/awb.cpp
> index 2b88c3b0..8d8ddf09 100644
> --- a/src/ipa/raspberrypi/controller/rpi/awb.cpp
> +++ b/src/ipa/raspberrypi/controller/rpi/awb.cpp
> @@ -104,6 +104,9 @@ int AwbConfig::read(const libcamera::YamlObject
> ¶ms)
> ret = readCtCurve(ctR, ctB, params["ct_curve"]);
> if (ret)
> return ret;
> + /* We will want the inverse functions of these too. */
> + ctRInverse = ctR.inverse();
> + ctBInverse = ctB.inverse();
> }
>
> if (params.contains("priors")) {
> @@ -174,7 +177,6 @@ Awb::Awb(Controller *controller)
> asyncAbort_ = asyncStart_ = asyncStarted_ = asyncFinished_ = false;
> mode_ = nullptr;
> manualR_ = manualB_ = 0.0;
> - firstSwitchMode_ = true;
> asyncThread_ = std::thread(std::bind(&Awb::asyncFunc, this));
> }
>
> @@ -270,27 +272,21 @@ void Awb::setManualGains(double manualR, double
> manualB)
> syncResults_.gainR = prevSyncResults_.gainR = manualR_;
> syncResults_.gainG = prevSyncResults_.gainG = 1.0;
> syncResults_.gainB = prevSyncResults_.gainB = manualB_;
> + if (config_.bayes) {
> + /* Also estimate the best corresponding colour
> temperature from the curves. */
> + double ctR =
> config_.ctRInverse.eval(config_.ctRInverse.domain().clip(1 / manualR_));
> + double ctB =
> config_.ctBInverse.eval(config_.ctBInverse.domain().clip(1 / manualB_));
> + prevSyncResults_.temperatureK = (ctR + ctB) / 2;
> + syncResults_.temperatureK =
> prevSyncResults_.temperatureK;
> + }
> }
> }
>
> void Awb::switchMode([[maybe_unused]] CameraMode const &cameraMode,
> Metadata *metadata)
> {
> - /*
> - * On the first mode switch we'll have no meaningful colour
> - * temperature, so try to dead reckon one if in manual mode.
> - */
> - if (!isAutoEnabled() && firstSwitchMode_ && config_.bayes) {
> - Pwl ctRInverse = config_.ctR.inverse();
> - Pwl ctBInverse = config_.ctB.inverse();
> - double ctR = ctRInverse.eval(ctRInverse.domain().clip(1 /
> manualR_));
> - double ctB = ctBInverse.eval(ctBInverse.domain().clip(1 /
> manualB_));
> - prevSyncResults_.temperatureK = (ctR + ctB) / 2;
> - syncResults_.temperatureK = prevSyncResults_.temperatureK;
> - }
> /* Let other algorithms know the current white balance values. */
> metadata->set("awb.status", prevSyncResults_);
> - firstSwitchMode_ = false;
> }
>
> bool Awb::isAutoEnabled() const
> diff --git a/src/ipa/raspberrypi/controller/rpi/awb.h
> b/src/ipa/raspberrypi/controller/rpi/awb.h
> index cb4cfd1b..30acd89d 100644
> --- a/src/ipa/raspberrypi/controller/rpi/awb.h
> +++ b/src/ipa/raspberrypi/controller/rpi/awb.h
> @@ -42,6 +42,8 @@ struct AwbConfig {
> bool fast; /* "fast" mode uses a 16x16 rather than 32x32 grid */
> Pwl ctR; /* function maps CT to r (= R/G) */
> Pwl ctB; /* function maps CT to b (= B/G) */
> + Pwl ctRInverse; /* inverse of ctR */
> + Pwl ctBInverse; /* inverse of ctB */
> /* table of illuminant priors at different lux levels */
> std::vector<AwbPrior> priors;
> /* AWB "modes" (determines the search range) */
> @@ -168,7 +170,6 @@ private:
> double manualR_;
> /* manual b setting */
> double manualB_;
> - bool firstSwitchMode_; /* is this the first call to SwitchMode? */
> };
>
> static inline Awb::RGB operator+(Awb::RGB const &a, Awb::RGB const &b)
> --
> 2.30.2
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20221028/d2739c82/attachment.htm>
More information about the libcamera-devel
mailing list