IDS peak IPL  v1.9.3
peak_ipl_color_corrector.hpp
Go to the documentation of this file.
1 
11 #pragma once
12 
18 
19 #include <type_traits>
20 #include <algorithm>
21 #include <cmath>
22 #include <cstddef>
23 #include <limits>
24 #include <utility>
25 #include <vector>
26 
30 namespace peak
31 {
32 namespace ipl
33 {
34 
35 class Image;
36 
41 {
66  ColorCorrectionFactors(float facRR, float facGR, float facBR, float facRG, float facGG, float facBG, float facRB,
67  float facGB, float facBB)
68  : factorRR(facRR)
69  , factorGR(facGR)
70  , factorBR(facBR)
71  , factorRG(facRG)
72  , factorGG(facGG)
73  , factorBG(facBG)
74  , factorRB(facRB)
75  , factorGB(facGB)
76  , factorBB(facBB)
77  {}
78 
85  ColorCorrectionFactors() = default;
86 
93  ~ColorCorrectionFactors() = default;
94 
104 
114 
124 
134 
146  {
147  return (isEqual(factorRR, other.factorRR) && isEqual(factorGR, other.factorGR)
148  && isEqual(factorBR, other.factorBR) && isEqual(factorRG, other.factorRG)
149  && isEqual(factorGG, other.factorGG) && isEqual(factorBG, other.factorBG)
150  && isEqual(factorRB, other.factorRB) && isEqual(factorGB, other.factorGB)
151  && isEqual(factorBB, other.factorBB));
152  }
153 
154  float factorRR{};
155  float factorGR{};
156  float factorBR{};
157  float factorRG{};
158  float factorGG{};
159  float factorBG{};
160  float factorRB{};
161  float factorGB{};
162  float factorBB{};
163 
164 private:
165  template <class T>
166  static typename std::enable_if<!std::numeric_limits<T>::is_integer, bool>::type isEqual(T x, T y)
167  {
168  return std::fabs(x - y) <= std::numeric_limits<T>::epsilon();
169  }
170 };
171 
175 class ColorCorrector final
176 {
177 public:
184  ColorCorrector();
185 
192  ~ColorCorrector();
193 
205  ColorCorrector(const ColorCorrector& other);
206 
218  ColorCorrector& operator=(const ColorCorrector& other);
219 
228  ColorCorrector(ColorCorrector&& other) noexcept;
229 
238  ColorCorrector& operator=(ColorCorrector&& other) noexcept;
239 
254  void SetColorCorrectionFactors(peak::ipl::ColorCorrectionFactors colorCorrectorFactors);
255 
264 
273 
281  PEAK_IPL_NO_DISCARD float Saturation() const;
282 
290  PEAK_IPL_NO_DISCARD float SaturationMin() const;
291 
299  PEAK_IPL_NO_DISCARD float SaturationMax() const;
300 
308  void SetSaturation(float saturation);
309 
319  PEAK_IPL_NO_DISCARD bool IsPixelFormatSupported(PixelFormatName pixelFormatName) const;
320 
332  void ProcessInPlace(Image& image) const;
333 
345  PEAK_IPL_NO_DISCARD Image Process(const Image& inputImage) const;
346 
347 private:
348  PEAK_IPL_COLOR_CORRECTOR_HANDLE m_backendHandle{};
349 };
350 
352 {
354 }
355 
357 {
358  if (m_backendHandle)
359  {
361  }
362 }
363 
365 {
366  if (other.m_backendHandle)
367  {
369  }
370 
371  m_backendHandle = other.m_backendHandle;
372 }
373 
375 {
376  if (this != &other)
377  {
378  if (m_backendHandle)
379  {
381  }
382 
383  if (other.m_backendHandle)
384  {
386  [&] { return PEAK_IPL_C_ABI_PREFIX PEAK_IPL_ColorCorrector_Acquire(other.m_backendHandle); });
387  }
388  }
389 
390  m_backendHandle = other.m_backendHandle;
391 
392  return *this;
393 }
394 
396 {
397  *this = std::move(other);
398 }
399 
401 {
402  if (this != &other)
403  {
404  if (m_backendHandle != nullptr)
405  {
407  }
408  m_backendHandle = other.m_backendHandle;
409  other.m_backendHandle = nullptr;
410  }
411 
412  return *this;
413 }
414 
416 {
419  m_backendHandle, reinterpret_cast<float*>(&colorCorrectorFactors));
420  });
421 }
422 
423 inline peak::ipl::ColorCorrectionFactors ColorCorrector::ColorCorrectionFactors()
424 {
425  size_t colorCorrectorFactorsSize = 0;
426 
429  m_backendHandle, nullptr, &colorCorrectorFactorsSize);
430  });
431 
432  peak::ipl::ColorCorrectionFactors colorCorrectorFactors;
433 
436  m_backendHandle, reinterpret_cast<float*>(&colorCorrectorFactors), &colorCorrectorFactorsSize);
437  });
438 
439  return colorCorrectorFactors;
440 }
441 
442 inline peak::ipl::ColorCorrectionFactors ColorCorrector::ColorCorrectionFactors() const
443 {
444  size_t colorCorrectorFactorsSize = 0;
445 
448  m_backendHandle, nullptr, &colorCorrectorFactorsSize);
449  });
450 
451  peak::ipl::ColorCorrectionFactors colorCorrectorFactors;
452 
455  m_backendHandle, reinterpret_cast<float*>(&colorCorrectorFactors), &colorCorrectorFactorsSize);
456  });
457 
458  return colorCorrectorFactors;
459 }
460 
461 inline float ColorCorrector::Saturation() const
462 {
463  float saturation;
464 
467  m_backendHandle, reinterpret_cast<float*>(&saturation));
468  });
469 
470  return saturation;
471 }
472 
473 inline float ColorCorrector::SaturationMin() const
474 {
475  float saturationMin;
476 
479  m_backendHandle, reinterpret_cast<float*>(&saturationMin));
480  });
481 
482  return saturationMin;
483 }
484 
485 inline float ColorCorrector::SaturationMax() const
486 {
487  float saturationMax;
488 
491  m_backendHandle, reinterpret_cast<float*>(&saturationMax));
492  });
493 
494  return saturationMax;
495 }
496 
497 inline void ColorCorrector::SetSaturation(float saturation)
498 {
501  m_backendHandle, saturation);
502  });
503 }
504 
505 inline bool ColorCorrector::IsPixelFormatSupported(PixelFormatName pixelFormatName) const
506 {
507  PEAK_IPL_BOOL8 isPixelFormatSupported = 0;
508 
511  static_cast<PEAK_IPL_PIXEL_FORMAT>(pixelFormatName),
512  reinterpret_cast<PEAK_IPL_BOOL8*>(&isPixelFormatSupported));
513  });
514 
515  return isPixelFormatSupported > 0;
516 }
517 
518 inline void ColorCorrector::ProcessInPlace(Image& image) const
519 {
522  m_backendHandle, ImageBackendAccessor::BackendHandle(image));
523  });
524 }
525 
526 inline Image ColorCorrector::Process(const Image& inputImage) const
527 {
528  PEAK_IPL_IMAGE_HANDLE outputImageHandle = nullptr;
531  m_backendHandle, ImageBackendAccessor::BackendHandle(inputImage), &outputImageHandle);
532  });
533 
534  return ImageBackendAccessor::CreateImage(outputImageHandle);
535 }
536 
537 } /* namespace ipl */
538 } /* namespace peak */
#define PEAK_IPL_NO_DISCARD
Definition: peak_ipl_backend.h:26
struct PEAK_IPL_COLOR_CORRECTOR * PEAK_IPL_COLOR_CORRECTOR_HANDLE
Definition: peak_ipl_backend.h:345
PEAK_IPL_C_API PEAK_IPL_ColorCorrector_SetColorCorrectionFactors(PEAK_IPL_COLOR_CORRECTOR_HANDLE colorCorrectorHandle, float *colorCorrectorFactors)
Sets the factors of the color correction matrix.
Applies a 3x3 color correction matrix to the data.
Definition: peak_ipl_color_corrector.hpp:175
float factorGB
Green-Blue Factor.
Definition: peak_ipl_color_corrector.hpp:161
PEAK_IPL_C_API PEAK_IPL_ColorCorrector_Acquire(PEAK_IPL_COLOR_CORRECTOR_HANDLE colorCorrectorHandle)
Increase the reference count of a color corrector.
#define PEAK_IPL_C_ABI_PREFIX
Definition: peak_ipl_dll_defines.h:16
The Factors of the Color Correction Matrix.
Definition: peak_ipl_color_corrector.hpp:40
float factorGG
Green-Green Factor.
Definition: peak_ipl_color_corrector.hpp:158
float factorBR
Blue-Red Factor.
Definition: peak_ipl_color_corrector.hpp:156
PEAK_IPL_C_API PEAK_IPL_ColorCorrector_GetColorCorrectionFactors(PEAK_IPL_COLOR_CORRECTOR_HANDLE colorCorrectorHandle, float *colorCorrectorFactors, size_t *colorCorrectorFactorsSize)
Returns the color corrector 3x3 matrix factors and its size.
The "peak::ipl" namespace contains the whole image processing library.
Definition: peak_ipl_binning.hpp:22
PixelFormatName
Enum holding the possible pixel format names.
Definition: peak_ipl_simple_types.hpp:38
PEAK_IPL_C_API PEAK_IPL_ColorCorrector_GetSaturation(PEAK_IPL_COLOR_CORRECTOR_HANDLE colorCorrectorHandle, float *saturation)
Returns the color saturation value.
PEAK_IPL_C_API PEAK_IPL_ColorCorrector_Construct(PEAK_IPL_COLOR_CORRECTOR_HANDLE *colorCorrectorHandle)
Creates a color corrector.
void ExecuteAndMapReturnCodes(const CallableType &callableObject)
Definition: peak_ipl_exception.hpp:182
float factorRG
Red-Green Factor.
Definition: peak_ipl_color_corrector.hpp:157
Stores the pixel format, width and height of an image and the pointer to the image buffer...
Definition: peak_ipl_image.hpp:39
PEAK_IPL_C_API PEAK_IPL_ColorCorrector_ProcessInPlace(PEAK_IPL_COLOR_CORRECTOR_HANDLE colorCorrectorHandle, PEAK_IPL_IMAGE_HANDLE imageHandle)
Corrects the colors of the given image.
float factorGR
Green-Red Factor.
Definition: peak_ipl_color_corrector.hpp:155
~ColorCorrector()
Destructor for the ColorCorrector instance.
Definition: peak_ipl_color_corrector.hpp:356
float factorRB
Red-Blue Factor.
Definition: peak_ipl_color_corrector.hpp:160
struct PEAK_IPL_IMAGE * PEAK_IPL_IMAGE_HANDLE
Definition: peak_ipl_backend.h:357
ColorCorrector & operator=(const ColorCorrector &other)
Copy assigment for ColorCorrector instance.
Definition: peak_ipl_color_corrector.hpp:374
void SetSaturation(float saturation)
Sets the color saturation value.
Definition: peak_ipl_color_corrector.hpp:497
ColorCorrectionFactors()=default
Constructor for a new ColorCorrectionFactors instance.
ColorCorrectionFactors(float facRR, float facGR, float facBR, float facRG, float facGG, float facBG, float facRB, float facGB, float facBB)
Constructor for a new ColorCorrectionFactors instance.
Definition: peak_ipl_color_corrector.hpp:66
PEAK_IPL_C_API PEAK_IPL_ColorCorrector_Process(PEAK_IPL_COLOR_CORRECTOR_HANDLE colorCorrectorHandle, PEAK_IPL_IMAGE_HANDLE imageHandle, PEAK_IPL_IMAGE_HANDLE *outputImageHandle)
Corrects the colors of the given image.
~ColorCorrectionFactors()=default
Destructor for the ColorCorrectionFactors instance.
int8_t PEAK_IPL_BOOL8
Definition: peak_ipl_backend.h:41
float factorBG
Blue-Green Factor.
Definition: peak_ipl_color_corrector.hpp:159
float factorBB
Blue-Blue Factor.
Definition: peak_ipl_color_corrector.hpp:162
PEAK_IPL_C_API PEAK_IPL_ColorCorrector_Destruct(PEAK_IPL_COLOR_CORRECTOR_HANDLE colorCorrectorHandle)
Destroys the color corrector associated with the given handle.
bool operator==(const Sharpness::SharpnessROI &lhs, const Sharpness::SharpnessROI &rhs)
Definition: peak_ipl_sharpness.hpp:419
PEAK_IPL_C_API PEAK_IPL_ColorCorrector_GetSaturationMax(PEAK_IPL_COLOR_CORRECTOR_HANDLE colorCorrectorHandle, float *saturationMax)
Returns the maximum color saturation value.
ColorCorrectionFactors & operator=(const ColorCorrectionFactors &o)=default
Copy assigment for ColorCorrectionFactors instance.
PEAK_IPL_C_API PEAK_IPL_ColorCorrector_GetSaturationMin(PEAK_IPL_COLOR_CORRECTOR_HANDLE colorCorrectorHandle, float *saturationMin)
Returns the minimum color saturation value.
void ProcessInPlace(Image &image) const
Corrects the colors of the given image by applying a 3x3 color correction matrix to the data in place...
Definition: peak_ipl_color_corrector.hpp:518
void SetColorCorrectionFactors(peak::ipl::ColorCorrectionFactors colorCorrectorFactors)
Sets the values of the color correction matrix.
Definition: peak_ipl_color_corrector.hpp:415
ColorCorrector()
Constructor for a new ColorCorrector instance.
Definition: peak_ipl_color_corrector.hpp:351
PEAK_IPL_C_API PEAK_IPL_ColorCorrector_SetSaturation(PEAK_IPL_COLOR_CORRECTOR_HANDLE colorCorrectorHandle, float saturation)
Sets the color saturation value.
PEAK_IPL_C_API PEAK_IPL_ColorCorrector_GetIsPixelFormatSupported(PEAK_IPL_COLOR_CORRECTOR_HANDLE colorCorrectorHandle, PEAK_IPL_PIXEL_FORMAT pixelFormat, PEAK_IPL_BOOL8 *isPixelFormatSupported)
Asks the given color corrector whether it supports the given pixel format.