IDS peak ICV v1.2.0
Loading...
Searching...
No Matches
peak_icv_unpack_module.hpp
Go to the documentation of this file.
1
11#pragma once
12
16#include <peak_icv_c/algorithms/preprocessing/peak_icv_image_converter.h>
17
18#include <utility>
19
20namespace peak
21{
22namespace pipeline
23{
24namespace detail
25{
38{
39public:
46
52 ~UnpackModule() override;
53
61 UnpackModule(const UnpackModule& other) = delete;
62
68 UnpackModule(UnpackModule&& other) noexcept;
69
77 UnpackModule& operator=(const UnpackModule& other) = delete;
78
84 UnpackModule& operator=(UnpackModule&& other) noexcept;
85
91 void Serialize(peak::common::serialization::IArchive& archive) const override;
92
98 void Deserialize(const peak::common::serialization::IArchive& archive) override;
99
105 void SetEnabled(bool enable) override;
106
114 PEAK_COMMON_NO_DISCARD bool IsEnabled() const override;
115
123 PEAK_COMMON_NO_DISCARD const char* GetType() const override;
124
132 void ResetToDefault() override;
133
144 void SetTargetBitDepth(size_t bitDepth);
145
146
156 size_t GetTargetBitDepth() const;
157
173
180
193 PEAK_COMMON_NO_DISCARD peak::icv::Image Process(const peak::icv::Image& input) const;
194
211 PEAK_COMMON_NO_DISCARD peak::common::Any Process(const peak::common::Any& input) const override;
212
226 void ReleaseBuffers() const;
227
228private:
229 PEAK_COMMON_NO_DISCARD static peak::common::PixelFormat GetOutputFormat(
230 peak::common::PixelFormat inputFormat, size_t outputBitDepth);
231 PEAK_COMMON_NO_DISCARD size_t GetOutputBitDepth(size_t inputBitDepth) const;
232
233 PEAK_COMMON_NO_DISCARD static peak::common::PixelFormat BayerBGFormat(size_t bitDepth);
234 PEAK_COMMON_NO_DISCARD static peak::common::PixelFormat BayerGBFormat(size_t bitDepth);
235 PEAK_COMMON_NO_DISCARD static peak::common::PixelFormat BayerGRFormat(size_t bitDepth);
236 PEAK_COMMON_NO_DISCARD static peak::common::PixelFormat BayerRGFormat(size_t bitDepth);
237 PEAK_COMMON_NO_DISCARD static peak::common::PixelFormat MonoFormat(size_t bitDepth);
238
239 peak_icv_image_converter_handle m_handle{};
240
241 size_t m_targetBitDepth{ 8 };
243};
244
246{
248 return PEAK_ICV_C_ABI_PREFIX peak_icv_Preprocessing_ImageConverter_Create(&m_handle);
249 });
250}
251
253{
254 if (m_handle != nullptr)
255 {
256 std::ignore = PEAK_ICV_C_ABI_PREFIX peak_icv_Preprocessing_ImageConverter_Destroy(m_handle);
257 }
258}
259
261{
262 std::swap(m_handle, other.m_handle);
263}
264
266{
267 if (this != &other)
268 {
269 std::swap(m_handle, other.m_handle);
270 }
271
272 return *this;
273}
274
276{
277 std::ignore = archive;
278}
279
281{
282 std::ignore = archive;
283}
284
285inline void UnpackModule::SetEnabled(bool enable)
286{
287 std::ignore = enable;
288}
289
290inline bool UnpackModule::IsEnabled() const
291{
292 return true;
293}
294
295inline const char* UnpackModule::GetType() const
296{
297 return "Unpack";
298}
299
300inline peak::common::PixelFormat UnpackModule::GetOutputFormat(
301 const peak::common::PixelFormat inputFormat, const size_t outputBitDepth)
302{
303 switch (inputFormat)
304 {
312 return BayerBGFormat(outputBitDepth);
313
321 return BayerGBFormat(outputBitDepth);
322
330 return BayerGRFormat(outputBitDepth);
331
339 return BayerRGFormat(outputBitDepth);
340
348 return MonoFormat(outputBitDepth);
349
354
355 default:
356 return inputFormat;
357 }
358}
359
360inline peak::common::PixelFormat UnpackModule::BayerBGFormat(const size_t bitDepth)
361{
362 if (bitDepth >= 12)
363 {
365 }
366 if (bitDepth >= 10)
367 {
369 }
371}
372
373inline peak::common::PixelFormat UnpackModule::BayerGBFormat(const size_t bitDepth)
374{
375 if (bitDepth >= 12)
376 {
378 }
379 if (bitDepth >= 10)
380 {
382 }
384}
385
386inline peak::common::PixelFormat UnpackModule::BayerGRFormat(const size_t bitDepth)
387{
388 if (bitDepth >= 12)
389 {
391 }
392 if (bitDepth >= 10)
393 {
395 }
397}
398
399inline peak::common::PixelFormat UnpackModule::BayerRGFormat(const size_t bitDepth)
400{
401 if (bitDepth >= 12)
402 {
404 }
405 if (bitDepth >= 10)
406 {
408 }
410}
411
412inline peak::common::PixelFormat UnpackModule::MonoFormat(const size_t bitDepth)
413{
414 if (bitDepth >= 12)
415 {
417 }
418 if (bitDepth >= 10)
419 {
421 }
423}
424
426{
427 m_policy = ProcessingPolicy::Fast;
428 m_targetBitDepth = 8;
429}
430
431inline void UnpackModule::SetTargetBitDepth(const size_t bitDepth)
432{
433 m_targetBitDepth = bitDepth;
434}
435
437{
438 return m_targetBitDepth;
439}
440
442{
443 m_policy = policy;
444}
445
447{
448 return m_policy;
449}
450
452{
453 return Process(peak::common::Any(input)).AnyCast<peak::icv::Image>();
454}
455
456inline size_t UnpackModule::GetOutputBitDepth(const size_t inputBitDepth) const
457{
458 if (m_policy == ProcessingPolicy::Fast)
459 {
460 return (std::min)(inputBitDepth, m_targetBitDepth);
461 }
462 if (m_policy == ProcessingPolicy::Enhanced)
463 {
464 return (std::max)(inputBitDepth, m_targetBitDepth);
465 }
466 return inputBitDepth;
467}
468
470{
471 const auto& inputImage = input.AnyCast<peak::icv::Image>();
472
473 const auto inputFormat = inputImage.GetPixelFormat();
474 const auto inputBitDepth = peak::common::PixelFormatInfo(inputFormat).GetStorageBitsPerChannel();
475 const auto outputBitDepth = GetOutputBitDepth(inputBitDepth);
476 const auto outputFormat = GetOutputFormat(inputFormat, outputBitDepth);
477
478 if (inputFormat == outputFormat)
479 {
480 return input;
481 }
482
483 auto* const inputImageHandle = peak::common::detail::BackendAccessor<peak::icv::Image>::BackendHandle(inputImage);
484 peak_icv_image_handle outputHandle = nullptr;
485
487 return PEAK_ICV_C_ABI_PREFIX peak_icv_Preprocessing_ImageConverter_Convert(
488 m_handle, inputImageHandle, peak::common::detail::CppPixelFormatToCPixelFormat(outputFormat), &outputHandle);
489 });
490
491 return peak::common::Any(peak::common::detail::BackendAccessor<peak::icv::Image>::CreateInstance(outputHandle));
492}
493
495{
497 return PEAK_ICV_C_ABI_PREFIX peak_icv_Preprocessing_ImageConverter_ReleaseBuffers(m_handle);
498 });
499}
500} // namespace detail
501} // namespace pipeline
502} // namespace peak
A type-erased container for any copyable value.
T & AnyCast()
Casts the stored value to the specified type.
Provides information and utility functions for pixel formats.
size_t GetStorageBitsPerChannel() const
Returns the number of bits used per channel for storage.
Interface for a hierarchical key-value archive system.
For detailed information about the use of ids_peak_icv Image refer to the Image Guide.
peak::common::PixelFormat GetPixelFormat() const
Provides the pixel format of the image.
Unpack is an image pipeline module that converts packed pixel formats into corresponding unpacked Bay...
size_t GetTargetBitDepth() const
Get the target bit depth used during image processing.
UnpackModule()
Creates an instance of class UnpackModule.
const char * GetType() const override
Returns the type of the module for serialization purposes.
void SetEnabled(bool enable) override
Does nothing. The module is always enabled, because otherwise following modules will fail.
void ReleaseBuffers() const
Frees unused internal buffers.
UnpackModule & operator=(const UnpackModule &other)=delete
Copy assignment for class UnpackModule is deleted.
void Serialize(peak::common::serialization::IArchive &archive) const override
This function has no effect on the Unpack module.
peak::icv::Image Process(const peak::icv::Image &input) const
Converts a packed pixel format image into an unpacked Bayer or monochrome format.
ProcessingPolicy GetProcessingPolicy() const
Get the currently configured processing policy.
void Deserialize(const peak::common::serialization::IArchive &archive) override
This function has no effect on the unpack module.
void SetProcessingPolicy(ProcessingPolicy policy)
Set the processing policy.
void ResetToDefault() override
Resets all module settings.
UnpackModule(const UnpackModule &other)=delete
Copy constructor for class UnpackModule is deleted.
void SetTargetBitDepth(size_t bitDepth)
Set the target bit depth.
bool IsEnabled() const override
Returns true since the unpack module is always enabled.
Interface for a module used within a pipeline.
PixelFormat
Enum listing all supported pixel formats and their internal IDs.
@ BayerRG12g24IDS
BayerRG 12-Bit grouped 24-bit (IDS)
@ RGB8
RGB 8-Bit pixel format.
@ Mono12p
Mono 12-Bit packed format.
@ Mono12
Mono 12-Bit pixel format.
@ BayerGB10
BayerGB 10-Bit pixel format.
@ BayerRG12p
BayerRG 12-Bit packed format.
@ BayerBG10
BayerBG 10-Bit pixel format.
@ Mono10g40IDS
Mono 10-Bit grouped 40-bit (IDS)
@ BayerGR10g40IDS
BayerGR 10-Bit grouped 40-bit (IDS)
@ BayerBG10p
BayerBG 10-Bit packed format.
@ BayerGB12p
BayerGB 12-Bit packed format.
@ BayerGR12
BayerGR 12-Bit pixel format.
@ BayerRG10p
BayerRG 10-Bit packed format.
@ BayerRG12
BayerRG 12-Bit pixel format.
@ BayerGR12p
BayerGR 12-Bit packed format.
@ BayerGR8
BayerGR 8-Bit pixel format.
@ BayerBG12p
BayerBG 12-Bit packed format.
@ BayerBG8
BayerBG 8-Bit pixel format.
@ Mono12g24IDS
Mono 12-Bit grouped 24-bit (IDS)
@ BayerRG10
BayerRG 10-Bit pixel format.
@ BayerGB12
BayerGB 12-Bit pixel format.
@ BayerRG8
BayerRG 8-Bit pixel format.
@ BayerGR10p
BayerGR 10-Bit packed format.
@ YUV422_8_UYVY
UYVY 4:2:2 8-Bit format.
@ YUV420_8_YY_VU_SemiplanarIDS
YUV4:2:0 8-Bit YY/VU semiplanar (IDS)
@ BayerGB8
BayerGB 8-Bit pixel format.
@ BayerGR12g24IDS
BayerGR 12-Bit grouped 24-bit (IDS)
@ YUV420_8_YY_UV_SemiplanarIDS
YUV4:2:0 8-Bit YY/UV semiplanar (IDS)
@ BayerGR10
BayerGR 10-Bit pixel format.
@ Mono10
Mono 10-Bit pixel format.
@ Mono8
Mono 8-Bit pixel format.
@ BayerBG12
BayerBG 12-Bit pixel format.
@ BayerBG10g40IDS
BayerBG 10-Bit grouped 40-bit (IDS)
@ BayerGB10p
BayerGB 10-Bit packed format.
@ BayerBG12g24IDS
BayerBG 12-Bit grouped 24-bit (IDS)
@ Mono10p
Mono 10-Bit packed format.
@ BayerRG10g40IDS
BayerRG 10-Bit grouped 40-bit (IDS)
@ BayerGB10g40IDS
BayerGB 10-Bit grouped 40-bit (IDS)
@ BayerGB12g24IDS
BayerGB 12-Bit grouped 24-bit (IDS)
ProcessingPolicy
Specifies the processing policy.
constexpr peak_common_pixel_format CppPixelFormatToCPixelFormat(PixelFormat pixelFormat) noexcept
void ExecuteAndMapReturnCodes(const CallableType &callableObject)
peak_icv_image * peak_icv_image_handle