From 0dbc6a507c682db1590105765119b7fa59f6493e Mon Sep 17 00:00:00 2001 From: David Plowman Date: Tue, 23 Jun 2020 10:14:03 +0100 Subject: libcamera: ipa: raspberrypi: Add sharpness strength control The sharpness control is, loosely speaking, a gain applied to the amount of sharpening added to an image. We also report the sharpness setting used back to the caller in metadata. Signed-off-by: David Plowman Reviewed-by: Laurent Pinchart Signed-off-by: Laurent Pinchart --- src/ipa/raspberrypi/controller/rpi/sharpen.cpp | 28 +++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) (limited to 'src/ipa/raspberrypi/controller/rpi/sharpen.cpp') diff --git a/src/ipa/raspberrypi/controller/rpi/sharpen.cpp b/src/ipa/raspberrypi/controller/rpi/sharpen.cpp index 4c2fdb3e..2b701db5 100644 --- a/src/ipa/raspberrypi/controller/rpi/sharpen.cpp +++ b/src/ipa/raspberrypi/controller/rpi/sharpen.cpp @@ -17,7 +17,7 @@ using namespace RPi; #define NAME "rpi.sharpen" Sharpen::Sharpen(Controller *controller) - : Algorithm(controller) + : SharpenAlgorithm(controller), user_strength_(1.0) { } @@ -42,14 +42,32 @@ void Sharpen::Read(boost::property_tree::ptree const ¶ms) limit_ = params.get("limit", 1.0); } +void Sharpen::SetStrength(double strength) +{ + // Note that this method is how an application sets the overall + // sharpening "strength". We call this the "user strength" field + // as there already is a strength_ field - being an internal gain + // parameter that gets passed to the ISP control code. Negative + // values are not allowed - coerce them to zero (no sharpening). + user_strength_ = std::max(0.0, strength); +} + void Sharpen::Prepare(Metadata *image_metadata) { + // The user_strength_ affects the algorithm's internal gain directly, but + // we adjust the limit and threshold less aggressively. Using a sqrt + // function is an arbitrary but gentle way of accomplishing this. + double user_strength_sqrt = sqrt(user_strength_); struct SharpenStatus status; // Binned modes seem to need the sharpening toned down with this - // pipeline. - status.threshold = threshold_ * mode_factor_; - status.strength = strength_ / mode_factor_; - status.limit = limit_ / mode_factor_; + // pipeline, thus we use the mode_factor here. Also avoid + // divide-by-zero with the user_strength_sqrt. + status.threshold = threshold_ * mode_factor_ / + std::max(0.01, user_strength_sqrt); + status.strength = strength_ / mode_factor_ * user_strength_; + status.limit = limit_ / mode_factor_ * user_strength_sqrt; + // Finally, report any application-supplied parameters that were used. + status.user_strength = user_strength_; image_metadata->Set("sharpen.status", status); } -- cgit v1.2.1