IDS peak AFL v2.0.2
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{
44inline std::unique_ptr<features::BrightnessLimit> CreateBrightnessLimit(
45 std::shared_ptr<peak::afl::Controller> controller, BrightnessComponentType type)
46{
47 switch (type)
48 {
50 return std::make_unique<features::BrightnessExposureLimit>(std::move(controller));
52 return std::make_unique<features::BrightnessGainLimit>(std::move(controller));
54 return std::make_unique<features::BrightnessGainAnalogLimit>(std::move(controller));
56 return std::make_unique<features::BrightnessGainDigitalLimit>(std::move(controller));
58 return std::make_unique<features::BrightnessGainCombinedLimit>(std::move(controller));
60 return std::make_unique<features::BrightnessGainHostLimit>(std::move(controller));
61 default:
63 }
64}
65
66class GenericAutoBrightness : public IController
67{
68 using ProcessingCallback = std::function<void()>;
69
70public:
71 friend BrightnessComponent;
72
73 explicit GenericAutoBrightness(
74 peak::afl::Manager& manager, ProcessingCallback callback, const std::vector<BrightnessComponentType>& componentTypes)
75 : IController(manager)
77 , m_processingCallback{ std::move(callback) }
78 , m_skipFrames{ std::make_unique<features::SkipFrames>(m_controller) }
79 , m_autoTarget{ std::make_unique<features::AutoTarget>(m_controller) }
80 , m_autoTolerance{ std::make_unique<features::AutoTolerance>(m_controller) }
81 , m_autoPercentile{ std::make_unique<features::AutoPercentile>(m_controller) }
82 , m_roi{ std::make_unique<features::Roi>(m_controller) }
83 , m_brightnessAlgorithm{ std::make_unique<features::BrightnessAlgorithm>(m_controller) }
84 {
85 GetManager().AddController(m_controller);
86
87 m_brightnessComponents.reserve(componentTypes.size());
88 for (const auto& componentType : componentTypes)
89 {
90 if (!m_controller->IsBrightnessComponentUnitSupported(detail::ToCType(componentType)))
91 {
92 continue;
93 }
94
95 m_brightnessComponents.emplace_back(std::unique_ptr<BrightnessComponent>(
96 new BrightnessComponent(m_controller, componentType, detail::CreateBrightnessLimit(m_controller, componentType))));
97 }
98
99 m_controller->RegisterFinishedCallback([this]() { m_FinishedCallbackManager.TriggerCallbacks(); });
100
101 m_controller->RegisterProcessingCallback([this](peak_afl_process_data* data) {
102 auto* brightness = reinterpret_cast<peak_afl_process_data_brightness*>(data);
103 if (brightness->controller_component != PEAK_AFL_CONTROLLER_BRIGHTNESS_COMPONENT_HOST_GAIN)
104 {
105 return;
106 }
107
108 if (m_processingCallback)
109 {
110 m_processingCallback();
111 }
112 });
113 }
114
115 PEAK_COMMON_NO_DISCARD std::string GetName() const override
116 {
117 return "GenericAutoBrightness";
118 }
119
120 void Serialize(peak::common::serialization::IArchive& archive) const override
121 {
122 for (const auto& feature : std::initializer_list<ISerializable*>{ m_skipFrames.get(), m_autoTarget.get(), m_autoTolerance.get(),
123 m_autoPercentile.get(), m_roi.get(), m_brightnessAlgorithm.get() })
124 {
125 feature->Serialize(archive);
126 }
127
128 for (const auto& component : m_brightnessComponents)
129 {
130 auto componentArchive = archive.CreateArchive();
131 component->Serialize(*componentArchive);
132
133 archive.SetArchive(ToString(component->GetType()), componentArchive);
134 }
135 }
136
137 void Deserialize(const peak::common::serialization::IArchive& archive) override
138 {
139 for (const auto& feature : std::initializer_list<ISerializable*>{ m_skipFrames.get(), m_autoTarget.get(), m_autoTolerance.get(),
140 m_autoPercentile.get(), m_roi.get(), m_brightnessAlgorithm.get() })
141 {
142 feature->Deserialize(archive);
143 }
144
145 for (const auto& component : m_brightnessComponents)
146 {
147 auto componentArchive = archive.GetArchive(ToString(component->GetType()));
148 component->Deserialize(*componentArchive);
149 }
150 }
151
152 PEAK_COMMON_NO_DISCARD ControllerType GetType() const override
153 {
155 }
156
157 void SetMode(ControllerMode mode) override
158 {
159 for (const auto& component : m_brightnessComponents)
160 {
161 component->SetMode(mode);
162 }
163 }
164
165 PEAK_COMMON_NO_DISCARD ControllerMode GetMode() const override
166 {
167 ControllerMode controllerMode{};
168 for (const auto& component : m_brightnessComponents)
169 {
170 if (controllerMode == ControllerMode::Continuous)
171 {
172 return controllerMode;
173 }
174
175 controllerMode = (std::max)(controllerMode, component->GetMode());
176 }
177
178 return controllerMode;
179 }
180
181 PEAK_COMMON_NO_DISCARD bool IsRunning() const override
182 {
183 return GetMode() != ControllerMode::Off;
184 }
185
186 PEAK_COMMON_NO_DISCARD features::SkipFrames& SkipFrames() const
187 {
188 return *m_skipFrames;
189 }
190
191 PEAK_COMMON_NO_DISCARD features::AutoTarget& AutoTarget() const
192 {
193 return *m_autoTarget;
194 }
195
196 PEAK_COMMON_NO_DISCARD features::AutoTolerance& AutoTolerance() const
197 {
198 return *m_autoTolerance;
199 }
200
201 PEAK_COMMON_NO_DISCARD features::AutoPercentile& AutoPercentile() const
202 {
203 return *m_autoPercentile;
204 }
205
206 PEAK_COMMON_NO_DISCARD features::Roi& Roi()
207 {
208 return *m_roi;
209 }
210
211 PEAK_COMMON_NO_DISCARD features::BrightnessAlgorithm& AnalysisAlgorithm() const
212 {
213 return *m_brightnessAlgorithm;
214 }
215
216 PEAK_COMMON_NO_DISCARD BrightnessComponent& ExposureComponent() const
217 {
218 auto* component = GetComponent(BrightnessComponentType::Exposure);
219 if (nullptr == component)
220 {
222 "Exposure component is not supported for the current device!", PEAK_AFL_STATUS_NOT_SUPPORTED);
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 {
239 "Analog gain component is not supported for the current device!", PEAK_AFL_STATUS_NOT_SUPPORTED);
240 }
241
242 return *component;
243 }
244
245 PEAK_COMMON_NO_DISCARD bool HasAnalogGainComponent() const
246 {
247 return GetComponent(BrightnessComponentType::AnalogGain) != nullptr;
248 }
249
250 PEAK_COMMON_NO_DISCARD BrightnessComponent& DigitalGainComponent() const
251 {
252 auto* component = GetComponent(BrightnessComponentType::DigitalGain);
253 if (nullptr == component)
254 {
256 "Digital gain component is not supported for the current device!", PEAK_AFL_STATUS_NOT_SUPPORTED);
257 }
258
259 return *component;
260 }
261
262 PEAK_COMMON_NO_DISCARD bool HasDigitalGainComponent() const
263 {
264 return GetComponent(BrightnessComponentType::DigitalGain) != nullptr;
265 }
266
267 PEAK_COMMON_NO_DISCARD BrightnessComponent& CombinedGainComponent() const
268 {
269 auto* component = GetComponent(BrightnessComponentType::CombinedGain);
270 if (nullptr == component)
271 {
273 "Combined gain component is not supported for the current device!", PEAK_AFL_STATUS_NOT_SUPPORTED);
274 }
275
276 return *component;
277 }
278
279 PEAK_COMMON_NO_DISCARD bool HasCombinedGainComponent() const
280 {
281 return GetComponent(BrightnessComponentType::CombinedGain) != nullptr;
282 }
283
284 PEAK_COMMON_NO_DISCARD BrightnessComponent& HostGainComponent() const
285 {
286 auto* component = GetComponent(BrightnessComponentType::HostGain);
287 if (nullptr == component)
288 {
290 "Host gain component is not available! Call IAutofeature::SetGainModule to set gain module!",
292 }
293
294 return *component;
295 }
296
297 PEAK_COMMON_NO_DISCARD bool HasHostGainComponent() const
298 {
299 return GetComponent(BrightnessComponentType::HostGain) != nullptr;
300 }
301
302 PEAK_COMMON_NO_DISCARD std::vector<BrightnessComponent*> GetComponents() const
303 {
304 std::vector<BrightnessComponent*> components;
305 std::transform(m_brightnessComponents.begin(), m_brightnessComponents.end(), std::back_inserter(components),
306 [](const auto& elem) { return elem.get(); });
307 return components;
308 }
309
310 PEAK_COMMON_NO_DISCARD BrightnessComponent* GetComponent(BrightnessComponentType componentType) const
311 {
312 auto entry = std::find_if(m_brightnessComponents.begin(), m_brightnessComponents.end(),
313 [componentType](const std::unique_ptr<BrightnessComponent>& component) { return component->GetType() == componentType; });
314 if (entry != m_brightnessComponents.end())
315 {
316 return entry->get();
317 }
318 return {};
319 }
320
321 void ResetToDefault() override
322 {
323 SetMode(ControllerMode::Off);
324 SkipFrames().Set(2);
325 AutoPercentile().Set(13);
326 AutoTarget().Set(150);
327 AutoTolerance().Set(3);
328 AnalysisAlgorithm().Set(BrightnessAnalysisAlgorithm::Median);
329 Roi().Set({});
330
331 for (auto* component : GetComponents())
332 {
333 component->SetLimit({ 0, (std::numeric_limits<double>::max)() });
334 }
335 }
336
337 IController::FinishedCallbackHandle RegisterFinishedCallback(const IController::FinishedCallback& callback)
338 {
339 return m_FinishedCallbackManager.RegisterCallback(callback);
340 }
341
342 void UnregisterFinishedCallback(IController::FinishedCallbackHandle callbackHandle)
343 {
344 m_FinishedCallbackManager.UnregisterCallback(callbackHandle);
345 }
346
347private:
348 peak::core::TTriggerCallbackManager<IController::FinishedCallbackHandle, IController::FinishedCallback>
349 m_FinishedCallbackManager;
350
351 std::shared_ptr<peak::afl::Controller> m_controller{};
352 std::vector<std::unique_ptr<BrightnessComponent>> m_brightnessComponents{};
353 ProcessingCallback m_processingCallback{};
354
355 std::unique_ptr<features::SkipFrames> m_skipFrames{};
356 std::unique_ptr<features::AutoTarget> m_autoTarget{};
357 std::unique_ptr<features::AutoTolerance> m_autoTolerance{};
358 std::unique_ptr<features::AutoPercentile> m_autoPercentile{};
359 std::unique_ptr<features::Roi> m_roi{};
360 std::unique_ptr<features::BrightnessAlgorithm> m_brightnessAlgorithm{};
361};
362} // namespace detail
363} // namespace autofeature
364} // namespace modules
365} // namespace pipeline
366} // namespace peak
static std::shared_ptr< Controller > Create(peak_afl_controllerType type)
Create a new controller.
Definition peak_afl.hpp:2427
void RegisterFinishedCallback(const callback::FinishedCallback &callback)
Set finished callback for a controller.
Definition peak_afl.hpp:2894
void RegisterProcessingCallback(const callback::ProcessingCallback &callback)
Set the data callback for a controller.
Definition peak_afl.hpp:3018
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:3220
Central coordination object for automatic camera feature control.
Definition peak_afl.hpp:663
void AddController(const std::shared_ptr< Controller > &controller)
Add a controller to an automanager.
Definition peak_afl.hpp:2252
The exception thrown for passing an invalid parameter to a function.
Definition peak_afl.hpp:391
The exception thrown when a functionality is not supported.
Definition peak_afl.hpp:416
Interface for a hierarchical key-value archive system.
Definition peak_common_iarchive.hpp:59
virtual std::shared_ptr< IArchive > GetArchive(const std::string &key) const =0
Retrieves a nested archive by key.
virtual 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:233
virtual std::string GetName() const =0
Gets the unique name of this controller.
peak::afl::Manager & GetManager()
Gets a reference to the API manager.
Definition peak_afl_icontroller.hpp:368
virtual bool IsRunning() const =0
Checks if the controller is currently running.
FinishedCallback * FinishedCallbackHandle
Handle type for managing callback registrations.
Definition peak_afl_icontroller.hpp:238
virtual ControllerType GetType() const =0
Gets the type of this controller.
virtual ControllerMode GetMode() const =0
Gets the current operational mode of this controller.
virtual void ResetToDefault()=0
Resets the controller to its default configuration.
void Set(const double &value) override
Sets the auto percentile value.
Definition peak_afl_auto_percentile.hpp:95
void Set(const uint32_t &value) override
Sets the auto target brightness value.
Definition peak_afl_auto_target.hpp:98
void Set(const uint32_t &value) override
Sets the auto tolerance value.
Definition peak_afl_auto_tolerance.hpp:101
void Set(const BrightnessAnalysisAlgorithm &value) override
Sets the brightness analysis algorithm.
Definition peak_afl_brightness_algorithm.hpp:212
void Set(const peak::common::Rectangle &value) override
Sets the region of interest rectangle.
Definition peak_afl_roi.hpp:98
void Set(const uint32_t &value) override
Sets the number of frames to skip.
Definition peak_afl_skip_frames.hpp:96
@ PEAK_AFL_CONTROLLER_TYPE_BRIGHTNESS
Automatic brightness exposure/gain controller.
Definition peak_afl.h:507
@ PEAK_AFL_CONTROLLER_BRIGHTNESS_COMPONENT_HOST_GAIN
Host-based software gain.
Definition peak_afl.h:955
@ PEAK_AFL_STATUS_NOT_SUPPORTED
Feature or operation not supported.
Definition peak_afl.h:465
@ PEAK_AFL_STATUS_INVALID_PARAMETER
Invalid parameter provided.
Definition peak_afl.h:419
ControllerMode
Controller operation mode enumeration.
Definition peak_afl_icontroller.hpp:59
ControllerType
Controller type enumeration.
Definition peak_afl_icontroller.hpp:40
std::string ToString(ControllerType mode)
Converts ControllerType enumeration to string representation.
Definition peak_afl_icontroller.hpp:78
@ Continuous
Continuous operation - automatic processing on every frame.
Definition peak_afl_icontroller.hpp:63
@ Off
Controller is disabled - no automatic processing.
Definition peak_afl_icontroller.hpp:61
@ Brightness
Automatic brightness controller - manages exposure and gain.
Definition peak_afl_icontroller.hpp:44
BrightnessComponentType
Brightness component type enumeration.
Definition peak_afl_brightness_component.hpp:38
@ Median
Median-based brightness calculation - uses the median value of pixel intensities.
Definition peak_afl_brightness_algorithm.hpp:42
@ CombinedGain
Combined gain component - both analog and digital (combined) gain.
Definition peak_afl_brightness_component.hpp:48
@ Gain
Automatic gain component - automatic gain control.
Definition peak_afl_brightness_component.hpp:52
@ AnalogGain
Analog gain component - hardware gain applied before digitization.
Definition peak_afl_brightness_component.hpp:44
@ DigitalGain
Digital gain component - gain applied after digitization.
Definition peak_afl_brightness_component.hpp:46
@ HostGain
Host gain component - software-based gain processing.
Definition peak_afl_brightness_component.hpp:50
@ Exposure
Exposure time component - controls sensor integration time.
Definition peak_afl_brightness_component.hpp:42
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:1175
Generic process data structure.
Definition peak_afl.h:1129