diff options
author | David Plowman <david.plowman@raspberrypi.com> | 2020-05-28 15:51:32 +0100 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2020-06-25 17:47:51 +0300 |
commit | 23e15e72f9745d4a11f41b366ff3c9e3dca51bf0 (patch) | |
tree | ab6b25be3144e0d5ea88b8993879735b6c764de8 /src/ipa/raspberrypi | |
parent | 0952f2014d1f08d1e5228f90680af16cb66653a6 (diff) |
ipa: rpi: Add "focus" algorithm
Adds FocusStatus to the image metadata, containing contrast measurements
across the image. Optionally also prints a contrast measure to the
console, to aid in manual adjustment of the lens. Note that it is not an
actual auto-focus algorithm that can drive a lens!
Signed-off-by: David Plowman <david.plowman@raspberrypi.com>
Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src/ipa/raspberrypi')
-rw-r--r-- | src/ipa/raspberrypi/controller/focus_status.h | 26 | ||||
-rw-r--r-- | src/ipa/raspberrypi/controller/rpi/focus.cpp | 51 | ||||
-rw-r--r-- | src/ipa/raspberrypi/controller/rpi/focus.hpp | 31 | ||||
-rw-r--r-- | src/ipa/raspberrypi/data/imx477.json | 4 | ||||
-rw-r--r-- | src/ipa/raspberrypi/meson.build | 1 |
5 files changed, 113 insertions, 0 deletions
diff --git a/src/ipa/raspberrypi/controller/focus_status.h b/src/ipa/raspberrypi/controller/focus_status.h new file mode 100644 index 00000000..3ad88777 --- /dev/null +++ b/src/ipa/raspberrypi/controller/focus_status.h @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ +/* + * Copyright (C) 2020, Raspberry Pi (Trading) Limited + * + * focus_status.h - focus measurement status + */ +#pragma once + +#include <linux/bcm2835-isp.h> + +// The focus algorithm should post the following structure into the image's +// "focus.status" metadata. Recall that it's only reporting focus (contrast) +// measurements, it's not driving any kind of auto-focus algorithm! + +#ifdef __cplusplus +extern "C" { +#endif + +struct FocusStatus { + int num; + uint32_t focus_measures[FOCUS_REGIONS]; +}; + +#ifdef __cplusplus +} +#endif diff --git a/src/ipa/raspberrypi/controller/rpi/focus.cpp b/src/ipa/raspberrypi/controller/rpi/focus.cpp new file mode 100644 index 00000000..1e2b6491 --- /dev/null +++ b/src/ipa/raspberrypi/controller/rpi/focus.cpp @@ -0,0 +1,51 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ +/* + * Copyright (C) 2020, Raspberry Pi (Trading) Limited + * + * focus.cpp - focus algorithm + */ +#include <stdint.h> + +#include "../focus_status.h" +#include "../logging.hpp" +#include "focus.hpp" + +using namespace RPi; + +#define NAME "rpi.focus" + +Focus::Focus(Controller *controller) + : Algorithm(controller) +{ +} + +char const *Focus::Name() const +{ + return NAME; +} + +void Focus::Read(boost::property_tree::ptree const ¶ms) +{ + print_ = params.get<int>("print", 0); +} + +void Focus::Process(StatisticsPtr &stats, Metadata *image_metadata) +{ + FocusStatus status; + unsigned int i; + for (i = 0; i < FOCUS_REGIONS; i++) + status.focus_measures[i] = stats->focus_stats[i].contrast_val[1][1] / 1000; + status.num = i; + image_metadata->Set("focus.status", status); + if (print_) { + uint32_t value = (status.focus_measures[5] + status.focus_measures[6]) / 10; + RPI_LOG("Focus contrast measure: " << value); + } +} + +/* Register algorithm with the system. */ +static Algorithm *Create(Controller *controller) +{ + return new Focus(controller); +} +static RegisterAlgorithm reg(NAME, &Create); diff --git a/src/ipa/raspberrypi/controller/rpi/focus.hpp b/src/ipa/raspberrypi/controller/rpi/focus.hpp new file mode 100644 index 00000000..d53401f7 --- /dev/null +++ b/src/ipa/raspberrypi/controller/rpi/focus.hpp @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ +/* + * Copyright (C) 2020, Raspberry Pi (Trading) Limited + * + * focus.hpp - focus algorithm + */ +#pragma once + +#include "../algorithm.hpp" +#include "../metadata.hpp" + +/* + * The "focus" algorithm. All it does it print out a version of the + * focus contrast measure; there is no actual auto-focus mechanism to + * control. + */ + +namespace RPi { + +class Focus : public Algorithm +{ +public: + Focus(Controller *controller); + char const *Name() const override; + void Read(boost::property_tree::ptree const ¶ms) override; + void Process(StatisticsPtr &stats, Metadata *image_metadata) override; +private: + bool print_; +}; + +} /* namespace RPi */ diff --git a/src/ipa/raspberrypi/data/imx477.json b/src/ipa/raspberrypi/data/imx477.json index dce5234f..389e8ce8 100644 --- a/src/ipa/raspberrypi/data/imx477.json +++ b/src/ipa/raspberrypi/data/imx477.json @@ -412,5 +412,9 @@ "rpi.sharpen": { + }, + "rpi.focus": + { + "print": 1 } } diff --git a/src/ipa/raspberrypi/meson.build b/src/ipa/raspberrypi/meson.build index 697902e9..9445cd09 100644 --- a/src/ipa/raspberrypi/meson.build +++ b/src/ipa/raspberrypi/meson.build @@ -29,6 +29,7 @@ rpi_ipa_sources = files([ 'controller/rpi/awb.cpp', 'controller/rpi/sharpen.cpp', 'controller/rpi/black_level.cpp', + 'controller/rpi/focus.cpp', 'controller/rpi/geq.cpp', 'controller/rpi/noise.cpp', 'controller/rpi/lux.cpp', |