[PATCH v1 10/11] ipa: rkisp1: Add support for bayes AWB algorithm from libipa

Dan Scally dan.scally at ideasonboard.com
Tue Jan 21 11:59:51 CET 2025


Hi Stefan

On 09/01/2025 11:54, Stefan Klug wrote:
> Now that libipa contains a bayes AWB algorithm, add it as supported
> algorithm to the rkisp1 ipa.
>
> The decision between the grey world algorithm and the bayesian is done
> based on the "algorithm" property of the "Awb" algorithm in the tuning
> file.
>
> Signed-off-by: Stefan Klug <stefan.klug at ideasonboard.com>
> ---
>
> Todo: The lux level is currently hardcoded to 1000. The result from the
> lux estimation needs to be used here.
> ---
>   src/ipa/rkisp1/algorithms/awb.cpp | 44 ++++++++++++++++++++++++++-----
>   1 file changed, 38 insertions(+), 6 deletions(-)
>
> diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp
> index 42a4784998bc..39a2c0589943 100644
> --- a/src/ipa/rkisp1/algorithms/awb.cpp
> +++ b/src/ipa/rkisp1/algorithms/awb.cpp
> @@ -16,6 +16,7 @@
>   
>   #include <libcamera/ipa/core_ipa_interface.h>
>   
> +#include "libipa/awb_bayes.h"
>   #include "libipa/awb_grey.h"
>   #include "libipa/colours.h"
>   
> @@ -45,13 +46,23 @@ class RkISP1AwbStats : public AwbStats
>   {
>   public:
>   	RkISP1AwbStats(const RGB<double> &rgbMeans)
> -		: rgbMeans_(rgbMeans) {}
> +		: rgbMeans_(rgbMeans)
> +	{
> +		rg_ = rgbMeans_.r() / rgbMeans_.g();
> +		bg_ = rgbMeans_.b() / rgbMeans_.g();
> +	}
>   
> -	double computeColourError([[maybe_unused]] const RGB<double> &gains) const override
> +	double computeColourError(const RGB<double> &gains) const override
>   	{
> -		LOG(RkISP1Awb, Error)
> -			<< "RkISP1AwbStats::computeColourError is not implemented";
> -		return 0.0;
> +		/*
> +		* Compute the sum of the squared colour error (non-greyness) as it
> +		* appears in the log likelihood equation.
> +		*/
> +		double deltaR = gains.r() * rg_ - 1.0;
> +		double deltaB = gains.b() * bg_ - 1.0;
> +		double delta2 = deltaR * deltaR + deltaB * deltaB;
> +
> +		return delta2;
>   	}
>   
>   	RGB<double> getRGBMeans() const override
> @@ -61,6 +72,8 @@ public:
>   
>   private:
>   	RGB<double> rgbMeans_;
> +	double rg_;
> +	double bg_;
>   };
>   
>   Awb::Awb()
> @@ -78,13 +91,30 @@ int Awb::init(IPAContext &context, const YamlObject &tuningData)
>   							 kMaxColourTemperature,
>   							 kDefaultColourTemperature);
>   
> -	awbAlgo_ = std::make_unique<AwbGrey>();
> +	if (!tuningData.contains("algorithm"))
> +		LOG(RkISP1Awb, Info) << "No awb algorithm specified."
> +				     << " Default to grey world";
> +
> +	auto mode = tuningData["algorithm"].get<std::string>("grey");
> +	if (mode == "grey") {
> +		awbAlgo_ = std::make_unique<AwbGrey>();
> +	} else if (mode == "bayes") {
> +		awbAlgo_ = std::make_unique<AwbBayes>();
> +	} else {
> +		LOG(RkISP1Awb, Error) << "Unknown awb algorithm: " << mode;
> +		return -EINVAL;
> +	}
> +	LOG(RkISP1Awb, Debug) << "Using awb algorithm: " << mode;

Much better than how I was expecting this to work:


Reviewed-by: Daniel Scally <dan.scally at ideasonboard.com>

> +
>   	int ret = awbAlgo_->init(tuningData);
>   	if (ret) {
>   		LOG(RkISP1Awb, Error) << "Failed to init awb algorithm";
>   		return ret;
>   	}
>   
> +	const auto &src = awbAlgo_->controls();
> +	cmap.insert(src.begin(), src.end());
> +
>   	return 0;
>   }
>   
> @@ -131,6 +161,8 @@ void Awb::queueRequest(IPAContext &context,
>   			<< (*awbEnable ? "Enabling" : "Disabling") << " AWB";
>   	}
>   
> +	awbAlgo_->handleControls(controls);
> +
>   	frameContext.awb.autoEnabled = awb.autoEnabled;
>   
>   	if (awb.autoEnabled)


More information about the libcamera-devel mailing list