IDS peak AFL v1.8.0
Loading...
Searching...
No Matches
peak_afl_generic_auto_brightness.hpp
Go to the documentation of this file.
1
10
11#pragma once
12
13#include <peak_afl/peak_afl.hpp>
22
23#include <peak/generic/peak_t_callback_manager.hpp>
24
27
28#include <algorithm>
29#include <limits>
30#include <memory>
31#include <utility>
32#include <vector>
33
34namespace peak
35{
36namespace pipeline
37{
38namespace modules
39{
40namespace autofeature
41{
42namespace detail
43{
44
45inline std::unique_ptr<features::BrightnessLimit> CreateBrightnessLimit(
46 std::shared_ptr<peak::afl::Controller> controller, BrightnessComponentType type)
47{
48 switch (type)
49 {
51 return std::make_unique<features::BrightnessExposureLimit>(std::move(controller));
53 return std::make_unique<features::BrightnessGainLimit>(std::move(controller));
55 return std::make_unique<features::BrightnessGainAnalogLimit>(std::move(controller));
57 return std::make_unique<features::BrightnessGainDigitalLimit>(std::move(controller));
59 return std::make_unique<features::BrightnessGainCombinedLimit>(std::move(controller));
61 return std::make_unique<features::BrightnessGainHostLimit>(std::move(controller));
62 default:
63 throw peak::common::InvalidParameterException("Unknown brightness component type");
64 }
65}
66
67class GenericAutoBrightness : public IController
68{
69 using ProcessingCallback = std::function<void()>;
70
71public:
72 friend BrightnessComponent;
73
74 explicit GenericAutoBrightness(
75 peak::afl::Manager& manager, ProcessingCallback callback, const std::vector<BrightnessComponentType>& componentTypes)
76 : IController(manager)
78 , m_processingCallback{ std::move(callback) }
79 , m_skipFrames{ std::make_unique<features::SkipFrames>(m_controller) }
80 , m_autoTarget{ std::make_unique<features::AutoTarget>(m_controller) }
81 , m_autoTolerance{ std::make_unique<features::AutoTolerance>(m_controller) }
82 , m_autoPercentile{ std::make_unique<features::AutoPercentile>(m_controller) }
83 , m_roi{ std::make_unique<features::Roi>(m_controller) }
84 , m_brightnessAlgorithm{ std::make_unique<features::BrightnessAlgorithm>(m_controller) }
85 {
86 GetManager().AddController(m_controller);
87
88 m_brightnessComponents.reserve(componentTypes.size());
89 for (const auto& componentType : componentTypes)
90 {
91 if (!m_controller->IsBrightnessComponentUnitSupported(detail::ToCType(componentType)))
92 {
93 continue;
94 }
95
96 m_brightnessComponents.emplace_back(std::unique_ptr<BrightnessComponent>(
97 new BrightnessComponent(m_controller, componentType, detail::CreateBrightnessLimit(m_controller, componentType))));
98 }
99
100 m_controller->RegisterFinishedCallback([this]() { m_FinishedCallbackManager.TriggerCallbacks(); });
101
102 m_controller->RegisterProcessingCallback([this](peak_afl_process_data* data) {
103 auto* brightness = reinterpret_cast<peak_afl_process_data_brightness*>(data);
104 if (brightness->controller_component != PEAK_AFL_CONTROLLER_BRIGHTNESS_COMPONENT_HOST_GAIN)
105 {
106 return;
107 }
108
109 if (m_processingCallback)
110 {
111 m_processingCallback();
112 }
113 });
114 }
115
116 PEAK_COMMON_NO_DISCARD std::string GetName() const override
117 {
118 return "GenericAutoBrightness";
119 }
120
121 void Serialize(peak::common::serialization::IArchive& archive) const override
122 {
123 for (const auto& feature : std::initializer_list<ISerializable*>{ m_skipFrames.get(), m_autoTarget.get(), m_autoTolerance.get(),
124 m_autoPercentile.get(), m_roi.get(), m_brightnessAlgorithm.get() })
125 {
126 feature->Serialize(archive);
127 }
128
129 for (const auto& component : m_brightnessComponents)
130 {
131 auto componentArchive = archive.CreateArchive();
132 component->Serialize(*componentArchive);
133
134 archive.SetArchive(ToString(component->GetType()), componentArchive);
135 }
136 }
137
138 void Deserialize(const peak::common::serialization::IArchive& archive) override
139 {
140 for (const auto& feature : std::initializer_list<ISerializable*>{ m_skipFrames.get(), m_autoTarget.get(), m_autoTolerance.get(),
141 m_autoPercentile.get(), m_roi.get(), m_brightnessAlgorithm.get() })
142 {
143 feature->Deserialize(archive);
144 }
145
146 for (const auto& component : m_brightnessComponents)
147 {
148 auto componentArchive = archive.GetArchive(ToString(component->GetType()));
149 component->Deserialize(*componentArchive);
150 }
151 }
152
153 PEAK_COMMON_NO_DISCARD ControllerType GetType() const override
154 {
156 }
157
158 void SetMode(ControllerMode mode) override
159 {
160 for (const auto& component : m_brightnessComponents)
161 {
162 component->SetMode(mode);
163 }
164 }
165
166 PEAK_COMMON_NO_DISCARD ControllerMode GetMode() const override
167 {
168 ControllerMode controllerMode{};
169 for (const auto& component : m_brightnessComponents)
170 {
171 if (controllerMode == ControllerMode::Continuous)
172 {
173 return controllerMode;
174 }
175
176 controllerMode = (std::max)(controllerMode, component->GetMode());
177 }
178
179 return controllerMode;
180 }
181
182 PEAK_COMMON_NO_DISCARD bool IsRunning() const override
183 {
184 return GetMode() != ControllerMode::Off;
185 }
186
187 PEAK_COMMON_NO_DISCARD features::SkipFrames& SkipFrames() const
188 {
189 return *m_skipFrames;
190 }
191
192 PEAK_COMMON_NO_DISCARD features::AutoTarget& AutoTarget() const
193 {
194 return *m_autoTarget;
195 }
196
197 PEAK_COMMON_NO_DISCARD features::AutoTolerance& AutoTolerance() const
198 {
199 return *m_autoTolerance;
200 }
201
202 PEAK_COMMON_NO_DISCARD features::AutoPercentile& AutoPercentile() const
203 {
204 return *m_autoPercentile;
205 }
206
207 PEAK_COMMON_NO_DISCARD features::Roi& Roi()
208 {
209 return *m_roi;
210 }
211
212 PEAK_COMMON_NO_DISCARD features::BrightnessAlgorithm& AnalysisAlgorithm() const
213 {
214 return *m_brightnessAlgorithm;
215 }
216
217 PEAK_COMMON_NO_DISCARD BrightnessComponent& ExposureComponent() const
218 {
219 auto* component = GetComponent(BrightnessComponentType::Exposure);
220 if (nullptr == component)
221 {
222 throw peak::common::NotSupportedException("Exposure component is not supported for the current device!");
223 }
224
225 return *component;
226 }
227
228 PEAK_COMMON_NO_DISCARD bool HasExposureComponent() const
229 {
230 return GetComponent(BrightnessComponentType::Exposure) != nullptr;
231 }
232
233 PEAK_COMMON_NO_DISCARD BrightnessComponent& AnalogGainComponent() const
234 {
235 auto* component = GetComponent(BrightnessComponentType::AnalogGain);
236 if (nullptr == component)
237 {
238 throw peak::common::NotSupportedException("Analog gain component is not supported for the current device!");
239 }
240
241 return *component;
242 }
243
244 PEAK_COMMON_NO_DISCARD bool HasAnalogGainComponent() const
245 {
246 return GetComponent(BrightnessComponentType::AnalogGain) != nullptr;
247 }
248
249 PEAK_COMMON_NO_DISCARD BrightnessComponent& DigitalGainComponent() const
250 {
251 auto* component = GetComponent(BrightnessComponentType::DigitalGain);
252 if (nullptr == component)
253 {
254 throw peak::common::NotSupportedException("Digital gain component is not supported for the current device!");
255 }
256
257 return *component;
258 }
259
260 PEAK_COMMON_NO_DISCARD bool HasDigitalGainComponent() const
261 {
262 return GetComponent(BrightnessComponentType::DigitalGain) != nullptr;
263 }
264
265 PEAK_COMMON_NO_DISCARD BrightnessComponent& CombinedGainComponent() const
266 {
267 auto* component = GetComponent(BrightnessComponentType::CombinedGain);
268 if (nullptr == component)
269 {
270 throw peak::common::NotSupportedException("Combined gain component is not supported for the current device!");
271 }
272
273 return *component;
274 }
275
276 PEAK_COMMON_NO_DISCARD bool HasCombinedGainComponent() const
277 {
278 return GetComponent(BrightnessComponentType::CombinedGain) != nullptr;
279 }
280
281 PEAK_COMMON_NO_DISCARD BrightnessComponent& HostGainComponent() const
282 {
283 auto* component = GetComponent(BrightnessComponentType::HostGain);
284 if (nullptr == component)
285 {
287 "Host gain component is not available! Call IAutofeature::SetGainModule to set gain module!");
288 }
289
290 return *component;
291 }
292
293 PEAK_COMMON_NO_DISCARD bool HasHostGainComponent() const
294 {
295 return GetComponent(BrightnessComponentType::HostGain) != nullptr;
296 }
297
298 PEAK_COMMON_NO_DISCARD std::vector<BrightnessComponent*> GetComponents() const
299 {
300 std::vector<BrightnessComponent*> components;
301 std::transform(m_brightnessComponents.begin(), m_brightnessComponents.end(), std::back_inserter(components),
302 [](const auto& elem) { return elem.get(); });
303 return components;
304 }
305
306 PEAK_COMMON_NO_DISCARD BrightnessComponent* GetComponent(BrightnessComponentType componentType) const
307 {
308 auto entry = std::find_if(m_brightnessComponents.begin(), m_brightnessComponents.end(),
309 [componentType](const std::unique_ptr<BrightnessComponent>& component) { return component->GetType() == componentType; });
310 if (entry != m_brightnessComponents.end())
311 {
312 return entry->get();
313 }
314 return {};
315 }
316
317 void ResetToDefault() override
318 {
319 SetMode(ControllerMode::Off);
320 SkipFrames().Set(2);
321 AutoPercentile().Set(13);
322 AutoTarget().Set(150);
323 AutoTolerance().Set(3);
324 AnalysisAlgorithm().Set(BrightnessAnalysisAlgorithm::Median);
325 Roi().Set({});
326
327 for (auto* component : GetComponents())
328 {
329 component->SetLimit({ 0, (std::numeric_limits<double>::max)() });
330 }
331 }
332
333 IController::FinishedCallbackHandle RegisterFinishedCallback(const IController::FinishedCallback& callback)
334 {
335 return m_FinishedCallbackManager.RegisterCallback(callback);
336 }
337
338 void UnregisterFinishedCallback(IController::FinishedCallbackHandle callbackHandle)
339 {
340 m_FinishedCallbackManager.UnregisterCallback(callbackHandle);
341 }
342
343private:
344 peak::core::TTriggerCallbackManager<IController::FinishedCallbackHandle, IController::FinishedCallback>
345 m_FinishedCallbackManager;
346
347 std::shared_ptr<peak::afl::Controller> m_controller{};
348 std::vector<std::unique_ptr<BrightnessComponent>> m_brightnessComponents{};
349 ProcessingCallback m_processingCallback{};
350
351 std::unique_ptr<features::SkipFrames> m_skipFrames{};
352 std::unique_ptr<features::AutoTarget> m_autoTarget{};
353 std::unique_ptr<features::AutoTolerance> m_autoTolerance{};
354 std::unique_ptr<features::AutoPercentile> m_autoPercentile{};
355 std::unique_ptr<features::Roi> m_roi{};
356 std::unique_ptr<features::BrightnessAlgorithm> m_brightnessAlgorithm{};
357};
358
359} // namespace detail
360
361} // namespace autofeature
362} // namespace modules
363} // namespace pipeline
364} // namespace peak
static PEAK_AFL_NO_DISCARD std::shared_ptr< Controller > Create(peak_afl_controllerType type)
Create a new controller.
Definition peak_afl.hpp:1977
void RegisterFinishedCallback(const callback::FinishedCallback &callback)
Set finished callback for a controller.
Definition peak_afl.hpp:2444
PEAK_AFL_NO_DISCARD bool IsBrightnessComponentUnitSupported(peak_afl_controller_brightness_component component) const
Check if a specific unit is supported for a brightness controller component.
Definition peak_afl.hpp:2746
void RegisterProcessingCallback(const callback::ProcessingCallback &callback)
Set the data callback for a controller.
Definition peak_afl.hpp:2550
The autofeature manager.
Definition peak_afl.hpp:306
void AddController(const std::shared_ptr< Controller > &controller)
Add a controller to an automanager.
Definition peak_afl.hpp:1798
Thrown when a function receives an invalid parameter.
Definition peak_common_exceptions.hpp:50
Thrown when an unsupported operation or feature is used.
Definition peak_common_exceptions.hpp:150
Interface for a hierarchical key-value archive system.
Definition peak_common_iarchive.hpp:59
virtual PEAK_COMMON_NO_DISCARD std::shared_ptr< IArchive > GetArchive(const std::string &key) const =0
Retrieves a nested archive by key.
virtual PEAK_COMMON_NO_DISCARD std::shared_ptr< IArchive > CreateArchive() const =0
Creates a new, empty archive instance.
virtual void SetArchive(const std::string &key, const std::shared_ptr< IArchive > &value)=0
Stores a nested archive object.
std::function< void()> FinishedCallback
Callback function type for operation completion notifications.
Definition peak_afl_icontroller.hpp:234
PEAK_COMMON_NO_DISCARD peak::afl::Manager & GetManager()
Gets a reference to the API manager.
Definition peak_afl_icontroller.hpp:369
FinishedCallback * FinishedCallbackHandle
Handle type for managing callback registrations.
Definition peak_afl_icontroller.hpp:239
void Set(const double &value) override
Sets the auto percentile value.
Definition peak_afl_auto_percentile.hpp:96
void Set(const uint32_t &value) override
Sets the auto target brightness value.
Definition peak_afl_auto_target.hpp:99
void Set(const uint32_t &value) override
Sets the auto tolerance value.
Definition peak_afl_auto_tolerance.hpp:102
void Set(const BrightnessAnalysisAlgorithm &value) override
Sets the brightness analysis algorithm.
Definition peak_afl_brightness_algorithm.hpp:213
void Set(const peak::common::Rectangle &value) override
Sets the region of interest rectangle.
Definition peak_afl_roi.hpp:99
void Set(const uint32_t &value) override
Sets the number of frames to skip.
Definition peak_afl_skip_frames.hpp:97
@ PEAK_AFL_CONTROLLER_TYPE_BRIGHTNESS
Automatic brightness exposure/gain controller.
Definition peak_afl.h:241
ControllerMode
Controller operation mode enumeration.
Definition peak_afl_icontroller.hpp:60
PEAK_COMMON_NO_DISCARD std::string ToString(ControllerType mode)
Converts ControllerType enumeration to string representation.
Definition peak_afl_icontroller.hpp:79
ControllerType
Controller type enumeration.
Definition peak_afl_icontroller.hpp:41
@ Continuous
Continuous operation - automatic processing on every frame.
Definition peak_afl_icontroller.hpp:64
@ Off
Controller is disabled - no automatic processing.
Definition peak_afl_icontroller.hpp:62
@ Brightness
Automatic brightness controller - manages exposure and gain.
Definition peak_afl_icontroller.hpp:45
BrightnessComponentType
Brightness component type enumeration.
Definition peak_afl_brightness_component.hpp:39
@ Median
Median-based brightness calculation - uses the median value of pixel intensities.
Definition peak_afl_brightness_algorithm.hpp:43
@ CombinedGain
Combined gain component - both analog and digital (combined) gain.
Definition peak_afl_brightness_component.hpp:49
@ Gain
Automatic gain component - automatic gain control.
Definition peak_afl_brightness_component.hpp:53
@ AnalogGain
Analog gain component - hardware gain applied before digitization.
Definition peak_afl_brightness_component.hpp:45
@ DigitalGain
Digital gain component - gain applied after digitization.
Definition peak_afl_brightness_component.hpp:47
@ HostGain
Host gain component - software-based gain processing.
Definition peak_afl_brightness_component.hpp:51
@ Exposure
Exposure time component - controls sensor integration time.
Definition peak_afl_brightness_component.hpp:43
@ PEAK_AFL_CONTROLLER_BRIGHTNESS_COMPONENT_HOST_GAIN
Host-based software gain.
Definition peak_afl.h:687
#define PEAK_COMMON_NO_DISCARD
Compatability macro for the nodiscard attribute.
Definition peak_common_defines.hpp:91
Interface definitions and implementations for individual module types used within a pipeline.
Definition peak_afl_generic_auto_brightness.hpp:39
Interfaces and implementations for defining and controlling data processing pipelines.
Definition peak_afl_generic_auto_brightness.hpp:37
Brightness controller process data.
Definition peak_afl.h:907
Generic process data structure.
Definition peak_afl.h:861