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:
parent
7ea83d5f7b
commit
b60bd37b1a
2 changed files with 52 additions and 41 deletions
|
@ -229,7 +229,7 @@ void Awb::process(IPAContext &context,
|
|||
const rkisp1_cif_isp_stat *params = &stats->params;
|
||||
const rkisp1_cif_isp_awb_stat *awb = ¶ms->awb;
|
||||
IPAActiveState &activeState = context.activeState;
|
||||
RGB<double> rgbMeans;
|
||||
RGB<double> rgbMeans = calculateRgbMeans(frameContext, awb);
|
||||
|
||||
metadata.set(controls::AwbEnable, frameContext.awb.autoEnabled);
|
||||
metadata.set(controls::ColourGains, {
|
||||
|
@ -243,6 +243,53 @@ void Awb::process(IPAContext &context,
|
|||
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_) {
|
||||
rgbMeans = {{
|
||||
static_cast<double>(awb->awb_mean[0].mean_y_or_g),
|
||||
|
@ -301,46 +348,7 @@ void Awb::process(IPAContext &context,
|
|||
*/
|
||||
rgbMeans /= frameContext.awb.gains;
|
||||
|
||||
/*
|
||||
* 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";
|
||||
return rgbMeans;
|
||||
}
|
||||
|
||||
REGISTER_IPA_ALGORITHM(Awb, "Awb")
|
||||
|
|
|
@ -39,6 +39,9 @@ public:
|
|||
ControlList &metadata) override;
|
||||
|
||||
private:
|
||||
RGB<double> calculateRgbMeans(const IPAFrameContext &frameContext,
|
||||
const rkisp1_cif_isp_awb_stat *awb) const;
|
||||
|
||||
std::optional<Interpolator<Vector<double, 2>>> colourGainCurve_;
|
||||
bool rgbMode_;
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue