IDS peak AFL v2.1.0
Loading...
Searching...
No Matches
peak_afl_generic_auto_brightness.hpp
Go to the documentation of this file.
1
6
7#pragma once
8
18
19#include <peak/generic/peak_t_callback_manager.hpp>
20
23
24#include <algorithm>
25#include <limits>
26#include <memory>
27#include <utility>
28#include <vector>
29
30namespace peak
31{
32namespace pipeline
33{
34namespace modules
35{
36namespace autofeature
37{
38namespace detail
39{
40inline std::unique_ptr<features::BrightnessLimit> CreateBrightnessLimit(
41 std::shared_ptr<peak::afl::Controller> controller, BrightnessComponentType type)
42{
43 switch (type)
44 {
46 return std::make_unique<features::BrightnessExposureLimit>(std::move(controller));
48 return std::make_unique<features::BrightnessGainLimit>(std::move(controller));
50 return std::make_unique<features::BrightnessGainAnalogLimit>(std::move(controller));
52 return std::make_unique<features::BrightnessGainDigitalLimit>(std::move(controller));
54 return std::make_unique<features::BrightnessGainCombinedLimit>(std::move(controller));
56 return std::make_unique<features::BrightnessGainHostLimit>(std::move(controller));
57 default:
59 }
60}
61
62class GenericAutoBrightness : public IController
63{
64 using ProcessingCallback = std::function<void()>;
65
66public:
67 friend BrightnessComponent;
68
69 explicit GenericAutoBrightness(
70 peak::afl::Manager& manager, ProcessingCallback callback, const std::vector<BrightnessComponentType>& componentTypes)
71 : IController(manager)
73 , m_processingCallback{ std::move(callback) }
74 , m_skipFrames{ std::make_unique<features::SkipFrames>(m_controller) }
75 , m_autoTarget{ std::make_unique<features::AutoTarget>(m_controller) }
76 , m_autoTolerance{ std::make_unique<features::AutoTolerance>(m_controller) }
77 , m_autoPercentile{ std::make_unique<features::AutoPercentile>(m_controller) }
78 , m_roi{ std::make_unique<features::Roi>(m_controller) }
79 , m_brightnessAlgorithm{ std::make_unique<features::BrightnessAlgorithm>(m_controller) }
80 {
81 GetManager().AddController(m_controller);
82
83 m_brightnessComponents.reserve(componentTypes.size());
84 for (const auto& componentType : componentTypes)
85 {
86 if (!m_controller->IsBrightnessComponentUnitSupported(detail::ToCType(componentType)))
87 {
88 continue;
89 }
90
91 m_brightnessComponents.emplace_back(std::unique_ptr<BrightnessComponent>(
92 new BrightnessComponent(m_controller, componentType, detail::CreateBrightnessLimit(m_controller, componentType))));
93 }
94
95 m_controller->RegisterFinishedCallback([this]() { m_FinishedCallbackManager.TriggerCallbacks(); });
96
97 m_controller->RegisterProcessingCallback([this](peak_afl_process_data* data) {
98 auto* brightness = reinterpret_cast<peak_afl_process_data_brightness*>(data);
99 if (brightness->controller_component != PEAK_AFL_CONTROLLER_BRIGHTNESS_COMPONENT_HOST_GAIN)
100 {
101 return;
102 }
103
104 if (m_processingCallback)
105 {
106 m_processingCallback();
107 }
108 });
109 }
110
111 PEAK_COMMON_NO_DISCARD std::string GetName() const override
112 {
113 return "GenericAutoBrightness";
114 }
115
116 void Serialize(peak::common::serialization::IArchive& archive) const override
117 {
118 for (const auto& feature : std::initializer_list<ISerializable*>{ m_skipFrames.get(), m_autoTarget.get(), m_autoTolerance.get(),
119 m_autoPercentile.get(), m_roi.get(), m_brightnessAlgorithm.get() })
120 {
121 feature->Serialize(archive);
122 }
123
124 for (const auto& component : m_brightnessComponents)
125 {
126 auto componentArchive = archive.CreateArchive();
127 component->Serialize(*componentArchive);
128
129 archive.SetArchive(ToString(component->GetType()), componentArchive);
130 }
131 }
132
133 void Deserialize(const peak::common::serialization::IArchive& archive) override
134 {
135 for (const auto& feature : std::initializer_list<ISerializable*>{ m_skipFrames.get(), m_autoTarget.get(), m_autoTolerance.get(),
136 m_autoPercentile.get(), m_roi.get(), m_brightnessAlgorithm.get() })
137 {
138 feature->Deserialize(archive);
139 }
140
141 for (const auto& component : m_brightnessComponents)
142 {
143 auto componentArchive = archive.GetArchive(ToString(component->GetType()));
144 component->Deserialize(*componentArchive);
145 }
146 }
147
148 PEAK_COMMON_NO_DISCARD ControllerType GetType() const override
149 {
151 }
152
153 void SetMode(ControllerMode mode) override
154 {
155 for (const auto& component : m_brightnessComponents)
156 {
157 component->SetMode(mode);
158 }
159 }
160
161 PEAK_COMMON_NO_DISCARD ControllerMode GetMode() const override
162 {
163 ControllerMode controllerMode{};
164 for (const auto& component : m_brightnessComponents)
165 {
166 if (controllerMode == ControllerMode::Continuous)
167 {
168 return controllerMode;
169 }
170
171 controllerMode = (std::max)(controllerMode, component->GetMode());
172 }
173
174 return controllerMode;
175 }
176
177 PEAK_COMMON_NO_DISCARD bool IsRunning() const override
178 {
179 return GetMode() != ControllerMode::Off;
180 }
181
182 PEAK_COMMON_NO_DISCARD features::SkipFrames& SkipFrames() const
183 {
184 return *m_skipFrames;
185 }
186
187 PEAK_COMMON_NO_DISCARD features::AutoTarget& AutoTarget() const
188 {
189 return *m_autoTarget;
190 }
191
192 PEAK_COMMON_NO_DISCARD features::AutoTolerance& AutoTolerance() const
193 {
194 return *m_autoTolerance;
195 }
196
197 PEAK_COMMON_NO_DISCARD features::AutoPercentile& AutoPercentile() const
198 {
199 return *m_autoPercentile;
200 }
201
202 PEAK_COMMON_NO_DISCARD features::Roi& Roi()
203 {
204 return *m_roi;
205 }
206
207 PEAK_COMMON_NO_DISCARD features::BrightnessAlgorithm& AnalysisAlgorithm() const
208 {
209 return *m_brightnessAlgorithm;
210 }
211
212 PEAK_COMMON_NO_DISCARD BrightnessComponent& ExposureComponent() const
213 {
214 auto* component = GetComponent(BrightnessComponentType::Exposure);
215 if (nullptr == component)
216 {
218 "Exposure component is not supported for the current device!", PEAK_AFL_STATUS_NOT_SUPPORTED);
219 }
220
221 return *component;
222 }
223
224 PEAK_COMMON_NO_DISCARD bool HasExposureComponent() const
225 {
226 return GetComponent(BrightnessComponentType::Exposure) != nullptr;
227 }
228
229 PEAK_COMMON_NO_DISCARD BrightnessComponent& AnalogGainComponent() const
230 {
231 auto* component = GetComponent(BrightnessComponentType::AnalogGain);
232 if (nullptr == component)
233 {
235 "Analog gain component is not supported for the current device!", PEAK_AFL_STATUS_NOT_SUPPORTED);
236 }
237
238 return *component;
239 }
240
241 PEAK_COMMON_NO_DISCARD bool HasAnalogGainComponent() const
242 {
243 return GetComponent(BrightnessComponentType::AnalogGain) != nullptr;
244 }
245
246 PEAK_COMMON_NO_DISCARD BrightnessComponent& DigitalGainComponent() const
247 {
248 auto* component = GetComponent(BrightnessComponentType::DigitalGain);
249 if (nullptr == component)
250 {
252 "Digital gain component is not supported for the current device!", PEAK_AFL_STATUS_NOT_SUPPORTED);
253 }
254
255 return *component;
256 }
257
258 PEAK_COMMON_NO_DISCARD bool HasDigitalGainComponent() const
259 {
260 return GetComponent(BrightnessComponentType::DigitalGain) != nullptr;
261 }
262
263 PEAK_COMMON_NO_DISCARD BrightnessComponent& CombinedGainComponent() const
264 {
265 auto* component = GetComponent(BrightnessComponentType::CombinedGain);
266 if (nullptr == component)
267 {
269 "Combined gain component is not supported for the current device!", PEAK_AFL_STATUS_NOT_SUPPORTED);
270 }
271
272 return *component;
273 }
274
275 PEAK_COMMON_NO_DISCARD bool HasCombinedGainComponent() const
276 {
277 return GetComponent(BrightnessComponentType::CombinedGain) != nullptr;
278 }
279
280 PEAK_COMMON_NO_DISCARD BrightnessComponent& HostGainComponent() const
281 {
282 auto* component = GetComponent(BrightnessComponentType::HostGain);
283 if (nullptr == component)
284 {
286 "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} // namespace detail
359} // namespace autofeature
360} // namespace modules
361} // namespace pipeline
362} // namespace peak
static std::shared_ptr< Controller > Create(peak_afl_controllerType type)
Create a new controller.
Definition peak_afl.hpp:2474
void RegisterFinishedCallback(const callback::FinishedCallback &callback)
Set finished callback for a controller.
Definition peak_afl.hpp:2941
void RegisterProcessingCallback(const callback::ProcessingCallback &callback)
Set the data callback for a controller.
Definition peak_afl.hpp:3065
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:3267
Central coordination object for automatic camera feature control.
Definition peak_afl.hpp:708
void AddController(const std::shared_ptr< Controller > &controller)
Add a controller to an automanager.
Definition peak_afl.hpp:2299
The exception thrown for passing an invalid parameter to a function.
Definition peak_afl.hpp:436
The exception thrown when a functionality is not supported.
Definition peak_afl.hpp:461
Interface for a hierarchical key-value archive system.
Definition peak_common_iarchive.hpp:54
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:229
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:364
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:234
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:91
void Set(const uint32_t &value) override
Sets the auto target brightness value.
Definition peak_afl_auto_target.hpp:94
void Set(const uint32_t &value) override
Sets the auto tolerance value.
Definition peak_afl_auto_tolerance.hpp:97
void Set(const BrightnessAnalysisAlgorithm &value) override
Sets the brightness analysis algorithm.
Definition peak_afl_brightness_algorithm.hpp:208
void Set(const peak::common::Rectangle &value) override
Sets the region of interest rectangle.
Definition peak_afl_roi.hpp:94
void Set(const uint32_t &value) override
Sets the number of frames to skip.
Definition peak_afl_skip_frames.hpp:92
@ PEAK_AFL_CONTROLLER_TYPE_BRIGHTNESS
Automatic brightness exposure/gain controller.
Definition peak_afl.h:504
@ PEAK_AFL_CONTROLLER_BRIGHTNESS_COMPONENT_HOST_GAIN
Host-based software gain.
Definition peak_afl.h:952
@ PEAK_AFL_STATUS_NOT_SUPPORTED
Feature or operation not supported.
Definition peak_afl.h:462
@ PEAK_AFL_STATUS_INVALID_PARAMETER
Invalid parameter provided.
Definition peak_afl.h:416
ControllerMode
Controller operation mode enumeration.
Definition peak_afl_icontroller.hpp:55
ControllerType
Controller type enumeration.
Definition peak_afl_icontroller.hpp:36
std::string ToString(ControllerType mode)
Converts ControllerType enumeration to string representation.
Definition peak_afl_icontroller.hpp:74
@ Continuous
Continuous operation - automatic processing on every frame.
Definition peak_afl_icontroller.hpp:59
@ Off
Controller is disabled - no automatic processing.
Definition peak_afl_icontroller.hpp:57
@ Brightness
Automatic brightness controller - manages exposure and gain.
Definition peak_afl_icontroller.hpp:40
BrightnessComponentType
Brightness component type enumeration.
Definition peak_afl_brightness_component.hpp:34
@ Median
Median-based brightness calculation - uses the median value of pixel intensities.
Definition peak_afl_brightness_algorithm.hpp:38
@ CombinedGain
Combined gain component - both analog and digital (combined) gain.
Definition peak_afl_brightness_component.hpp:44
@ Gain
Automatic gain component - automatic gain control.
Definition peak_afl_brightness_component.hpp:48
@ AnalogGain
Analog gain component - hardware gain applied before digitization.
Definition peak_afl_brightness_component.hpp:40
@ DigitalGain
Digital gain component - gain applied after digitization.
Definition peak_afl_brightness_component.hpp:42
@ HostGain
Host gain component - software-based gain processing.
Definition peak_afl_brightness_component.hpp:46
@ Exposure
Exposure time component - controls sensor integration time.
Definition peak_afl_brightness_component.hpp:38
Interface definitions and implementations for individual module types used within a pipeline.
Definition peak_afl_generic_auto_brightness.hpp:35
Interfaces and implementations for defining and controlling data processing pipelines.
Definition peak_afl_generic_auto_brightness.hpp:33
Brightness controller process data.
Definition peak_afl.h:1172
Generic process data structure.
Definition peak_afl.h:1126