IDS peak IPL v1.17.0
Loading...
Searching...
No Matches
peak_ipl_histogram.hpp
Go to the documentation of this file.
1
10
11#pragma once
12
17
18#include <cstddef>
19#include <cstdint>
20#include <utility>
21#include <vector>
22
27
28namespace peak
29{
30namespace ipl
31{
32
36class Histogram final
37{
38public:
43 {
44 uint64_t PixelSum;
45 uint64_t PixelCount;
46 std::vector<uint64_t> Bins;
47 };
48
49public:
50 Histogram() = delete;
63 explicit Histogram(const Image& image);
64
71 ~Histogram();
72
84 Histogram(const Histogram& other);
85
97 Histogram& operator=(const Histogram& other);
98
107 Histogram(Histogram&& other) noexcept;
108
117 Histogram& operator=(Histogram&& other) noexcept;
118
129
139 PEAK_IPL_NO_DISCARD std::vector<HistogramChannel> Channels() const;
140
141private:
142 PEAK_IPL_HISTOGRAM_HANDLE m_backendHandle{};
143};
144
145inline Histogram::Histogram(const Image& image)
146{
149 ImageBackendAccessor::BackendHandle(image), &m_backendHandle);
150 });
151}
152
154{
155 if (m_backendHandle)
156 {
158 }
159}
160
161inline Histogram::Histogram(const Histogram& other)
162{
163 if (other.m_backendHandle)
164 {
165 ExecuteAndMapReturnCodes([&] { return PEAK_IPL_C_ABI_PREFIX PEAK_IPL_Histogram_Acquire(other.m_backendHandle); });
166 }
167
168 m_backendHandle = other.m_backendHandle;
169}
170
172{
173 if (this != &other)
174 {
175 if (m_backendHandle)
176 {
178 }
179
180 if (other.m_backendHandle)
181 {
183 [&] { return PEAK_IPL_C_ABI_PREFIX PEAK_IPL_Histogram_Acquire(other.m_backendHandle); });
184 }
185 }
186
187 m_backendHandle = other.m_backendHandle;
188
189 return *this;
190}
191
192inline Histogram::Histogram(Histogram&& other) noexcept
193{
194 *this = std::move(other);
195}
196
197inline Histogram& Histogram::operator=(Histogram&& other) noexcept
198{
199 if (this != &other)
200 {
201 if (m_backendHandle != nullptr)
202 {
204 }
205
206 m_backendHandle = other.m_backendHandle;
207 other.m_backendHandle = nullptr;
208 }
209
210 return *this;
211}
212
214{
216
219 m_backendHandle, reinterpret_cast<PEAK_IPL_PIXEL_FORMAT*>(&pixelFormatName));
220 });
221
222 return peak::ipl::PixelFormat{ pixelFormatName };
223}
224
225inline std::vector<Histogram::HistogramChannel> Histogram::Channels() const
226{
227 std::vector<HistogramChannel> channels;
228
229 size_t numChannels = 0;
231 [&] { return PEAK_IPL_C_ABI_PREFIX PEAK_IPL_Histogram_GetNumChannels(m_backendHandle, &numChannels); });
232
233 for (size_t ch = 0; ch < numChannels; ++ch)
234 {
235 uint64_t pixelSum = 0;
237 return PEAK_IPL_C_ABI_PREFIX PEAK_IPL_Histogram_GetPixelSumForChannel(m_backendHandle, ch, &pixelSum);
238 });
239
240 uint64_t pixelCount = 0;
242 return PEAK_IPL_C_ABI_PREFIX PEAK_IPL_Histogram_GetPixelCountForChannel(m_backendHandle, ch, &pixelCount);
243 });
244
245 size_t binListSize = 0;
247 return PEAK_IPL_C_ABI_PREFIX PEAK_IPL_Histogram_GetBinsForChannel(m_backendHandle, ch, nullptr, &binListSize);
248 });
249 std::vector<uint64_t> binList(binListSize);
252 m_backendHandle, ch, binList.data(), &binListSize);
253 });
254
255 channels.emplace_back(HistogramChannel{ pixelSum, pixelCount, std::move(binList) });
256 }
257
258 return channels;
259}
260
261} /* namespace ipl */
262} /* namespace peak */
peak::ipl::PixelFormat PixelFormat() const
Returns the pixel format of the histogram.
Definition peak_ipl_histogram.hpp:213
std::vector< HistogramChannel > Channels() const
Returns a vector containing the bin list of each channel.
Definition peak_ipl_histogram.hpp:225
~Histogram()
Destructor for the Histogram instance.
Definition peak_ipl_histogram.hpp:153
Histogram & operator=(const Histogram &other)
Copy assigment for Histogram instance.
Definition peak_ipl_histogram.hpp:171
Stores the pixel format, width and height of an image and the pointer to the image buffer.
Definition peak_ipl_image.hpp:46
Represents a pixel format and its specific properties.
Definition peak_ipl_pixel_format.hpp:34
The "peak::ipl" namespace contains the whole image processing library.
PixelFormatName
Enum holding the possible pixel format names.
Definition peak_ipl_simple_types.hpp:41
@ Invalid
Invalid Pixel Format.
Definition peak_ipl_simple_types.hpp:42
void ExecuteAndMapReturnCodes(const CallableType &callableObject)
Definition peak_ipl_exception.hpp:271
#define PEAK_IPL_NO_DISCARD
Definition peak_ipl_attribute_defines.h:25
PEAK_IPL_C_API PEAK_IPL_Histogram_Destruct(PEAK_IPL_HISTOGRAM_HANDLE histogramHandle)
Destroys the histogram associated with the given handle.
PEAK_IPL_C_API PEAK_IPL_Histogram_Construct(PEAK_IPL_IMAGE_HANDLE imageHandle, PEAK_IPL_HISTOGRAM_HANDLE *histogramHandle)
Creates a histogram from image data.
PEAK_IPL_C_API PEAK_IPL_Histogram_GetPixelFormat(PEAK_IPL_HISTOGRAM_HANDLE histogramHandle, PEAK_IPL_PIXEL_FORMAT *pixelFormat)
Queries the pixel format of the given histogram.
struct PEAK_IPL_HISTOGRAM * PEAK_IPL_HISTOGRAM_HANDLE
Definition peak_ipl_backend.h:409
PEAK_IPL_C_API PEAK_IPL_Histogram_Acquire(PEAK_IPL_HISTOGRAM_HANDLE histogramHandle)
Increase the reference count of a histogram object.
PEAK_IPL_C_API PEAK_IPL_Histogram_GetNumChannels(PEAK_IPL_HISTOGRAM_HANDLE histogramHandle, size_t *numChannels)
Queries the number of the given histogram's channels.
PEAK_IPL_C_API PEAK_IPL_Histogram_GetPixelSumForChannel(PEAK_IPL_HISTOGRAM_HANDLE histogramHandle, size_t channelIndex, uint64_t *pixelSum)
Queries the pixel sum for the channel with the given index.
PEAK_IPL_C_API PEAK_IPL_Histogram_GetBinsForChannel(PEAK_IPL_HISTOGRAM_HANDLE histogramHandle, size_t channelIndex, uint64_t *bins, size_t *binsSize)
Queries the bin list of the channel with the given index.
PEAK_IPL_C_API PEAK_IPL_Histogram_GetPixelCountForChannel(PEAK_IPL_HISTOGRAM_HANDLE histogramHandle, size_t channelIndex, uint64_t *pixelCount)
Queries the pixel count for the channel with the given index.
int32_t PEAK_IPL_PIXEL_FORMAT
Definition peak_ipl_backend.h:173
#define PEAK_IPL_C_ABI_PREFIX
Definition peak_ipl_dll_defines.h:16
Stores the values of the histogram.
Definition peak_ipl_histogram.hpp:43
uint64_t PixelCount
Definition peak_ipl_histogram.hpp:45
std::vector< uint64_t > Bins
Definition peak_ipl_histogram.hpp:46
uint64_t PixelSum
Definition peak_ipl_histogram.hpp:44