ipa: rkisp1: Move calculation of RGB means into own function

Move the calculation of the RGB means into an own function for better
code clarity. This commit doesn't contain any functional changes.

Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>
This commit is contained in:
Stefan Klug 2025-01-23 12:40:56 +01:00
parent 7ea83d5f7b
commit b60bd37b1a
2 changed files with 52 additions and 41 deletions

View file

@ -229,7 +229,7 @@ void Awb::process(IPAContext &context,
const rkisp1_cif_isp_stat *params = &stats->params; const rkisp1_cif_isp_stat *params = &stats->params;
const rkisp1_cif_isp_awb_stat *awb = &params->awb; const rkisp1_cif_isp_awb_stat *awb = &params->awb;
IPAActiveState &activeState = context.activeState; IPAActiveState &activeState = context.activeState;
RGB<double> rgbMeans; RGB<double> rgbMeans = calculateRgbMeans(frameContext, awb);
metadata.set(controls::AwbEnable, frameContext.awb.autoEnabled); metadata.set(controls::AwbEnable, frameContext.awb.autoEnabled);
metadata.set(controls::ColourGains, { metadata.set(controls::ColourGains, {
@ -243,6 +243,53 @@ void Awb::process(IPAContext &context,
return; return;
} }
/*
* If the means are too small we don't have enough information to
* meaningfully calculate gains. Freeze the algorithm in that case.
*/
if (rgbMeans.r() < kMeanMinThreshold && rgbMeans.g() < kMeanMinThreshold &&
rgbMeans.b() < kMeanMinThreshold)
return;
activeState.awb.temperatureK = estimateCCT(rgbMeans);
/* Metadata shall contain the up to date measurement */
metadata.set(controls::ColourTemperature, activeState.awb.temperatureK);
/*
* Estimate the red and blue gains to apply in a grey world. The green
* gain is hardcoded to 1.0. Avoid divisions by zero by clamping the
* divisor to a minimum value of 1.0.
*/
RGB<double> gains({ rgbMeans.g() / std::max(rgbMeans.r(), 1.0),
1.0,
rgbMeans.g() / std::max(rgbMeans.b(), 1.0) });
/*
* Clamp the gain values to the hardware, which expresses gains as Q2.8
* unsigned integer values. Set the minimum just above zero to avoid
* divisions by zero when computing the raw means in subsequent
* iterations.
*/
gains = gains.max(1.0 / 256).min(1023.0 / 256);
/* Filter the values to avoid oscillations. */
double speed = 0.2;
gains = gains * speed + activeState.awb.gains.automatic * (1 - speed);
activeState.awb.gains.automatic = gains;
LOG(RkISP1Awb, Debug)
<< std::showpoint
<< "Means " << rgbMeans << ", gains "
<< activeState.awb.gains.automatic << ", temp "
<< activeState.awb.temperatureK << "K";
}
RGB<double> Awb::calculateRgbMeans(const IPAFrameContext &frameContext, const rkisp1_cif_isp_awb_stat *awb) const
{
Vector<double, 3> rgbMeans;
if (rgbMode_) { if (rgbMode_) {
rgbMeans = {{ rgbMeans = {{
static_cast<double>(awb->awb_mean[0].mean_y_or_g), static_cast<double>(awb->awb_mean[0].mean_y_or_g),
@ -301,46 +348,7 @@ void Awb::process(IPAContext &context,
*/ */
rgbMeans /= frameContext.awb.gains; rgbMeans /= frameContext.awb.gains;
/* return rgbMeans;
* If the means are too small we don't have enough information to
* meaningfully calculate gains. Freeze the algorithm in that case.
*/
if (rgbMeans.r() < kMeanMinThreshold && rgbMeans.g() < kMeanMinThreshold &&
rgbMeans.b() < kMeanMinThreshold)
return;
activeState.awb.temperatureK = estimateCCT(rgbMeans);
/*
* Estimate the red and blue gains to apply in a grey world. The green
* gain is hardcoded to 1.0. Avoid divisions by zero by clamping the
* divisor to a minimum value of 1.0.
*/
RGB<double> gains({
rgbMeans.g() / std::max(rgbMeans.r(), 1.0),
1.0,
rgbMeans.g() / std::max(rgbMeans.b(), 1.0)
});
/*
* Clamp the gain values to the hardware, which expresses gains as Q2.8
* unsigned integer values. Set the minimum just above zero to avoid
* divisions by zero when computing the raw means in subsequent
* iterations.
*/
gains = gains.max(1.0 / 256).min(1023.0 / 256);
/* Filter the values to avoid oscillations. */
double speed = 0.2;
gains = gains * speed + activeState.awb.gains.automatic * (1 - speed);
activeState.awb.gains.automatic = gains;
LOG(RkISP1Awb, Debug)
<< std::showpoint
<< "Means " << rgbMeans << ", gains "
<< activeState.awb.gains.automatic << ", temp "
<< activeState.awb.temperatureK << "K";
} }
REGISTER_IPA_ALGORITHM(Awb, "Awb") REGISTER_IPA_ALGORITHM(Awb, "Awb")

View file

@ -39,6 +39,9 @@ public:
ControlList &metadata) override; ControlList &metadata) override;
private: private:
RGB<double> calculateRgbMeans(const IPAFrameContext &frameContext,
const rkisp1_cif_isp_awb_stat *awb) const;
std::optional<Interpolator<Vector<double, 2>>> colourGainCurve_; std::optional<Interpolator<Vector<double, 2>>> colourGainCurve_;
bool rgbMode_; bool rgbMode_;
}; };