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

Stefan Klug stefan.klug at ideasonboard.com
Thu Jan 9 12:54:01 CET 2025


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;
+
 	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)
-- 
2.43.0



More information about the libcamera-devel mailing list