Ocean
SumAbsoluteDifferences.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) Meta Platforms, Inc. and affiliates.
3  *
4  * This source code is licensed under the MIT license found in the
5  * LICENSE file in the root directory of this source tree.
6  */
7 
8 #ifndef META_OCEAN_CV_SUM_ABSOLUTE_DIFFERENCES_H
9 #define META_OCEAN_CV_SUM_ABSOLUTE_DIFFERENCES_H
10 
11 #include "ocean/cv/CV.h"
15 
16 #include "ocean/base/DataType.h"
17 
18 #include "ocean/math/Numeric.h"
19 
20 namespace Ocean
21 {
22 
23 namespace CV
24 {
25 
26 /**
27  * This class implements functions calculation the sum of absolute differences.
28  * @ingroup cv
29  */
31 {
32  public:
33 
34  /**
35  * Returns the sum of absolute differences between two square image patches.
36  * @param image0 The image in which the first patch is located, must be valid
37  * @param image1 The image in which the second patch is located, must be valid
38  * @param width0 The width of the first image, in pixels, with range [tPatchSize, infinity)
39  * @param width1 The width of the second image, in pixels, with range [tPatchSize, infinity)
40  * @param centerX0 Horizontal center position of the (tPatchSize x tPatchSize) block in the first frame, with range [tPatchSize/2, width - tPatchSize/2 - 1]
41  * @param centerY0 Vertical center position of the (tPatchSize x tPatchSize) block in the first frame, with range [tPatchSize/2, height - tPatchSize/2 - 1]
42  * @param centerX1 Horizontal center position of the (tPatchSize x tPatchSize) block in the second frame, with range [tPatchSize/2, width - tPatchSize/2 - 1]
43  * @param centerY1 Vertical center position of the (tPatchSize x tPatchSize) block in the second frame, with range [tPatchSize/2, height - tPatchSize/2 - 1]
44  * @param image0PaddingElements The number of padding elements at the end of each row of the first image, in elements, with range [0, infinity)
45  * @param image1PaddingElements The number of padding elements at the end of each row of the second image, in elements, with range [0, infinity)
46  * @return The resulting sum of square differences, with range [0, infinity)
47  * @tparam tChannels The number of frame channels, with range [1, infinity)
48  * @tparam tPatchSize The size of the square patch (the edge length) in pixel, with range [1, infinity), must be odd
49  */
50  template <unsigned int tChannels, unsigned int tPatchSize>
51  static inline uint32_t patch8BitPerChannel(const uint8_t* const image0, const uint8_t* const image1, const unsigned int width0, const unsigned int width1, const unsigned int centerX0, const unsigned int centerY0, const unsigned int centerX1, const unsigned int centerY1, const unsigned int image0PaddingElements, const unsigned int image1PaddingElements);
52 
53  /**
54  * Returns the sum of absolute differences between an image patch and a memory buffer.
55  * @param image0 The image in which the image patch is located, must be valid
56  * @param width0 Width of the first frame in pixels, with range [tPatchSize, infinity)
57  * @param centerX0 Horizontal center position of the (tPatchSize x tPatchSize) block in the first frame, with range [tPatchSize / 2, width0 - tPatchSize / 2 - 1]
58  * @param centerY0 Vertical center position of the (tPatchSize x tPatchSize) block in the first frame, with range [tPatchSize / 2, height0 - tPatchSize / 2 - 1]
59  * @param image0PaddingElements The number of padding elements at the end of each row of the first image, in elements, with range [0, infinity)
60  * @param buffer1 The memory buffer with `tChannels * tPatchSize * tPatchSize` elements, must be valid
61  * @return The resulting sum of absolute differences for tPatchSize * tPatchSize * tChannels elements, with range [0, infinity)
62  * @tparam tChannels The number of channels for the given frames, with range [1, infinity)
63  * @tparam tPatchSize The size of the square patch (the edge length) in pixel, with range [1, infinity), must be odd
64  */
65  template <unsigned int tChannels, unsigned int tPatchSize>
66  static inline uint32_t patchBuffer8BitPerChannel(const uint8_t* const image0, const unsigned int width0, const unsigned int centerX0, const unsigned int centerY0, const unsigned int image0PaddingElements, const uint8_t* const buffer1);
67 
68  /**
69  * Returns the sum of square differences between two memory buffers.
70  * @param buffer0 The first memory buffer, must be valid
71  * @param buffer1 The second memory buffer, must be valid
72  * @return The resulting sum of square differences
73  * @tparam tChannels The number of channels the buffers have, with range [1, infinity)
74  * @tparam tPixels The number of pixels the buffer holds, in pixels, with range [1, infinity)
75  */
76  template <unsigned int tChannels, unsigned int tPixels>
77  static inline uint32_t buffer8BitPerChannel(const uint8_t* buffer0, const uint8_t* buffer1);
78 
79  /**
80  * Returns the sum of absolute differences between two patches within an image, patch pixels outside the image will be mirrored back into the image.
81  * @param image0 The image in which the first patch is located, must be valid
82  * @param image1 The image in which the second patch is located, must be valid
83  * @param width0 The width of the first image, in pixels, with range [tPatchSize, infinity)
84  * @param height0 The height of the first image, in pixels, with range [tPatchSize, infinity)
85  * @param width1 The width of the second image, in pixels, with range [tPatchSize, infinity)
86  * @param height1 The height of the second image, in pixels, with range [tPatchSize, infinity)
87  * @param centerX0 Horizontal center position of the (tPatchSize x tPatchSize) block in the first frame, with range [tPatchSize/2, width - tPatchSize/2 - 1]
88  * @param centerY0 Vertical center position of the (tPatchSize x tPatchSize) block in the first frame, with range [tPatchSize/2, height - tPatchSize/2 - 1]
89  * @param centerX1 Horizontal center position of the (tPatchSize x tPatchSize) block in the second frame, with range [tPatchSize/2, width - tPatchSize/2 - 1]
90  * @param centerY1 Vertical center position of the (tPatchSize x tPatchSize) block in the second frame, with range [tPatchSize/2, height - tPatchSize/2 - 1]
91  * @param image0PaddingElements The number of padding elements at the end of each row of the first image, in elements, with range [0, infinity)
92  * @param image1PaddingElements The number of padding elements at the end of each row of the second image, in elements, with range [0, infinity)
93  * @return The resulting sum of absolute differences, with range [0, infinity)
94  * @tparam tChannels The number of frame channels, with range [1, infinity)
95  * @tparam tPatchSize The size of the square patch (the edge length) in pixel, with range [1, infinity), must be odd
96  */
97  template <unsigned int tChannels, unsigned int tPatchSize>
98  static uint32_t patchMirroredBorder8BitPerChannel(const uint8_t* image0, const uint8_t* image1, const unsigned int width0, const unsigned int height0, const unsigned int width1, const unsigned int height1, const unsigned int centerX0, const unsigned int centerY0, const unsigned int centerX1, const unsigned int centerY1, const unsigned int image0PaddingElements, const unsigned int image1PaddingElements);
99 
100  /**
101  * Determines the sum of absolute differences between two individual frames, individually for each channel.
102  * @param firstFrame The first frame for which the absolute difference will be determined, must be valid
103  * @param secondFrame The second frame for which the absolute difference will be determined, must be valid
104  * @param width The with of the first frame and second frame in pixel, with range [1, infinity)
105  * @param height The height of the first frame and second frame in pixel, with range [1, infinity)
106  * @param absoluteDifferences The resulting absolute differences, one for each channel, must be valid, with range [0, infinity)
107  * @param firstFramePaddingElements The number of optional padding elements at the end of each row of the first frame, in elements, with range [0, infinity)
108  * @param secondFramePaddingElements The number of optional padding elements at the end of each row of the second frame, in elements, with range [0, infinity)
109  * @tparam T The data type of each pixel element, e.g., 'uint8_t' or 'float'
110  * @tparam tChannels The number of frame channels, with range [1, infinity)
111  */
112  template <typename T, unsigned int tChannels>
113  static void determine(const T* firstFrame, const T* secondFrame, const unsigned int width, const unsigned int height, typename AbsoluteDifferenceValueTyper<T>::Type* absoluteDifferences, const unsigned int firstFramePaddingElements, const unsigned int secondFramePaddingElements);
114 
115  /**
116  * Determines the sum of absolute differences between two individual frames, individually for each plane, and individually for each channel.
117  * @param firstFrame The first frame for which the absolute difference will be determined, must be valid, must have an element type of FrameType::DT_UNSIGNED_INTEGER_8.
118  * @param secondFrame The second frame for which the absolute difference will be determined, must be valid, must have the same frame type as 'firstFrame'
119  * @param absoluteDifferences The resulting absolute differences, one for each plane and channel; first all differences for the first plane, then all differences for the second plane etc., with range [0, infinity)
120  * @return True, if succeeded
121  */
122  static inline bool determine(const Frame& firstFrame, const Frame& secondFrame, Indices32& absoluteDifferences);
123 };
124 
125 template <unsigned int tChannels, unsigned int tPatchSize>
126 inline uint32_t SumAbsoluteDifferences::patch8BitPerChannel(const uint8_t* image0, const uint8_t* image1, const unsigned int width0, const unsigned int width1, const unsigned int centerX0, const unsigned int centerY0, const unsigned int centerX1, const unsigned int centerY1, const unsigned int image0PaddingElements, const unsigned int image1PaddingElements)
127 {
128  static_assert(tChannels >= 1u, "Invalid channel number!");
129  static_assert(tPatchSize % 2u == 1u, "Invalid patch size!");
130 
131  ocean_assert(image0 != nullptr && image1 != nullptr);
132 
133  ocean_assert(width0 >= tPatchSize);
134  ocean_assert(width1 >= tPatchSize);
135 
136  constexpr unsigned int tPatchSize_2 = tPatchSize / 2u;
137 
138  ocean_assert(centerX0 >= tPatchSize_2 && centerY0 >= tPatchSize_2);
139  ocean_assert(centerX1 >= tPatchSize_2 && centerY1 >= tPatchSize_2);
140 
141  ocean_assert(centerX0 < width0 - tPatchSize_2);
142  ocean_assert(centerX1 < width1 - tPatchSize_2);
143 
144  const unsigned int image0StrideElements = width0 * tChannels + image0PaddingElements;
145  const unsigned int image1StrideElements = width1 * tChannels + image1PaddingElements;
146 
147  const uint8_t* const patch0 = image0 + (centerY0 - tPatchSize_2) * image0StrideElements + (centerX0 - tPatchSize_2) * tChannels;
148  const uint8_t* const patch1 = image1 + (centerY1 - tPatchSize_2) * image1StrideElements + (centerX1 - tPatchSize_2) * tChannels;
149 
150 #if defined(OCEAN_HARDWARE_SSE_VERSION) && OCEAN_HARDWARE_SSE_VERSION >= 41
151 
152  if constexpr (tPatchSize >= 5u)
153  {
154  return SumAbsoluteDifferencesSSE::patch8BitPerChannel<tChannels, tPatchSize>(patch0, patch1, image0StrideElements, image1StrideElements);
155  }
156 
157 #elif defined(OCEAN_HARDWARE_NEON_VERSION) && OCEAN_HARDWARE_NEON_VERSION >= 10
158 
159  if constexpr (tPatchSize >= 5u)
160  {
161  return SumAbsoluteDifferencesNEON::patch8BitPerChannel<tChannels, tPatchSize>(patch0, patch1, image0StrideElements, image1StrideElements);
162  }
163 
164 #endif // OCEAN_HARDWARE_SSE_VERSION, OCEAN_HARDWARE_NEON_VERSION
165 
166  return SumAbsoluteDifferencesBase::patch8BitPerChannelTemplate<tChannels, tPatchSize>(patch0, patch1, image0StrideElements, image1StrideElements);
167 }
168 
169 template <unsigned int tChannels, unsigned int tPatchSize>
170 inline uint32_t SumAbsoluteDifferences::patchBuffer8BitPerChannel(const uint8_t* const image0, const unsigned int width0, const unsigned int centerX0, const unsigned int centerY0, const unsigned int image0PaddingElements, const uint8_t* const buffer1)
171 {
172  static_assert(tChannels >= 1u, "Invalid channel number!");
173  static_assert(tPatchSize % 2u == 1u, "Invalid patch size!");
174 
175  ocean_assert(image0 != nullptr && buffer1 != nullptr);
176 
177  ocean_assert(width0 >= tPatchSize);
178 
179  constexpr unsigned int tPatchSize_2 = tPatchSize / 2u;
180 
181  ocean_assert(centerX0 >= tPatchSize_2 && centerY0 >= tPatchSize_2);
182 
183  ocean_assert(centerX0 < width0 - tPatchSize_2);
184 
185  const unsigned int image0StrideElements = width0 * tChannels + image0PaddingElements;
186 
187  const uint8_t* const patch0 = image0 + (centerY0 - tPatchSize_2) * image0StrideElements + (centerX0 - tPatchSize_2) * tChannels;
188 
189 #if defined(OCEAN_HARDWARE_SSE_VERSION) && OCEAN_HARDWARE_SSE_VERSION >= 41
190 
191  if constexpr (tPatchSize >= 5u)
192  {
193  return SumAbsoluteDifferencesSSE::patchBuffer8BitPerChannel<tChannels, tPatchSize>(patch0, buffer1, image0StrideElements);
194  }
195 
196 #elif defined(OCEAN_HARDWARE_NEON_VERSION) && OCEAN_HARDWARE_NEON_VERSION >= 10
197 
198  if constexpr (tPatchSize >= 5u)
199  {
200  return SumAbsoluteDifferencesNEON::patchBuffer8BitPerChannel<tChannels, tPatchSize>(patch0, buffer1, image0StrideElements);
201  }
202 
203 #endif // OCEAN_HARDWARE_SSE_VERSION, OCEAN_HARDWARE_NEON_VERSION
204 
205  return SumAbsoluteDifferencesBase::patchBuffer8BitPerChannelTemplate<tChannels, tPatchSize>(patch0, buffer1, image0StrideElements);
206 }
207 
208 template <unsigned int tChannels, unsigned int tPixels>
209 inline uint32_t SumAbsoluteDifferences::buffer8BitPerChannel(const uint8_t* const buffer0, const uint8_t* const buffer1)
210 {
211  static_assert(tChannels >= 1u, "Invalid channel number!");
212  static_assert(tPixels >= 1u, "Invalid pixel number!");
213 
214  constexpr unsigned int tElements = tChannels * tPixels;
215 
216 #if defined(OCEAN_HARDWARE_SSE_VERSION) && OCEAN_HARDWARE_SSE_VERSION >= 41
217 
218  if constexpr (tElements >= 15u)
219  {
220  return SumAbsoluteDifferencesSSE::buffer8BitPerChannel<tElements>(buffer0, buffer1);
221  }
222 
223 #elif defined(OCEAN_HARDWARE_NEON_VERSION) && OCEAN_HARDWARE_NEON_VERSION >= 10
224 
225  if constexpr (tElements >= 8u)
226  {
227  return SumAbsoluteDifferencesNEON::buffer8BitPerChannel<tElements>(buffer0, buffer1);
228  }
229 
230 #endif // OCEAN_HARDWARE_SSE_VERSION, OCEAN_HARDWARE_NEON_VERSION
231 
232  return SumAbsoluteDifferencesBase::buffer8BitPerChannelTemplate<tElements>(buffer0, buffer1);
233 }
234 
235 template <unsigned int tChannels, unsigned int tPatchSize>
236 uint32_t SumAbsoluteDifferences::patchMirroredBorder8BitPerChannel(const uint8_t* image0, const uint8_t* image1, const unsigned int width0, const unsigned int height0, const unsigned int width1, const unsigned int height1, const unsigned int centerX0, const unsigned int centerY0, const unsigned int centerX1, const unsigned int centerY1, const unsigned int image0PaddingElements, const unsigned int image1PaddingElements)
237 {
238  static_assert(tChannels >= 1u, "Invalid channel number!");
239  static_assert(tPatchSize % 2u == 1u, "Invalid patch size!");
240 
241  return SumAbsoluteDifferencesBase::patchMirroredBorder8BitPerChannelTemplate<tChannels>(image0, image1, tPatchSize, width0, height0, width1, height1, centerX0, centerY0, centerX1, centerY1, image0PaddingElements, image1PaddingElements);
242 }
243 
244 template <typename T, unsigned int tChannels>
245 void SumAbsoluteDifferences::determine(const T* firstFrame, const T* secondFrame, const unsigned int width, const unsigned int height, typename AbsoluteDifferenceValueTyper<T>::Type* absoluteDifferences, const unsigned int firstFramePaddingElements, const unsigned int secondFramePaddingElements)
246 {
247  ocean_assert(firstFrame != nullptr);
248  ocean_assert(secondFrame != nullptr);
249  ocean_assert(width != 0u && height != 0u);
250  ocean_assert(absoluteDifferences != nullptr);
251 
252  typedef typename AbsoluteDifferenceValueTyper<T>::Type TResult;
253  typedef typename DifferenceValueTyper<T>::Type TDifferenceType;
254 
255  const unsigned int firstFrameStrideElements = width * tChannels + firstFramePaddingElements;
256  const unsigned int secondFrameStrideElements = width * tChannels + secondFramePaddingElements;
257 
258  TResult result[tChannels];
259 
260  for (unsigned int n = 0u; n < tChannels; ++n)
261  {
262  result[n] = TResult(0);
263  }
264 
265  for (unsigned int y = 0u; y < height; ++y)
266  {
267  for (unsigned int x = 0u; x < width; ++x)
268  {
269  for (unsigned int n = 0u; n < tChannels; ++n)
270  {
271  result[n] += TResult(NumericT<TDifferenceType>::abs(TDifferenceType(firstFrame[x * tChannels + n] - secondFrame[x * tChannels + n])));
272  }
273  }
274 
275  firstFrame += firstFrameStrideElements;
276  secondFrame += secondFrameStrideElements;
277  }
278 
279  for (unsigned int n = 0u; n < tChannels; ++n)
280  {
281  absoluteDifferences[n] = result[n];
282  }
283 }
284 
285 inline bool SumAbsoluteDifferences::determine(const Frame& firstFrame, const Frame& secondFrame, Indices32& absoluteDifferences)
286 {
287  ocean_assert(firstFrame.isValid() && secondFrame.isValid());
288  ocean_assert(firstFrame.frameType() == secondFrame.frameType());
289  ocean_assert(firstFrame.dataType() == FrameType::DT_UNSIGNED_INTEGER_8);
290 
291  absoluteDifferences.clear();
292 
293  if (!firstFrame.isValid() || firstFrame.dataType() != FrameType::DT_UNSIGNED_INTEGER_8 || firstFrame.frameType() != secondFrame.frameType())
294  {
295  return false;
296  }
297 
298  for (unsigned int planeIndex = 0u; planeIndex < firstFrame.numberPlanes(); ++planeIndex)
299  {
300  switch (firstFrame.planeChannels(planeIndex))
301  {
302  case 1u:
303  {
304  unsigned int planeAbsoluteDifference = 0u;
305  determine<uint8_t, 1u>(firstFrame.constdata<uint8_t>(planeIndex), secondFrame.constdata<uint8_t>(planeIndex), firstFrame.planeWidth(planeIndex), firstFrame.planeHeight(planeIndex), &planeAbsoluteDifference, firstFrame.paddingElements(planeIndex), secondFrame.paddingElements(planeIndex));
306  absoluteDifferences.emplace_back(planeAbsoluteDifference);
307  break;
308  }
309 
310  case 2u:
311  {
312  unsigned int planeAbsoluteDifferences[2] = {0u, 0u};
313  determine<uint8_t, 2u>(firstFrame.constdata<uint8_t>(planeIndex), secondFrame.constdata<uint8_t>(planeIndex), firstFrame.planeWidth(planeIndex), firstFrame.planeHeight(planeIndex), planeAbsoluteDifferences, firstFrame.paddingElements(planeIndex), secondFrame.paddingElements(planeIndex));
314  absoluteDifferences.emplace_back(planeAbsoluteDifferences[0]);
315  absoluteDifferences.emplace_back(planeAbsoluteDifferences[1]);
316  break;
317  }
318 
319  case 3u:
320  {
321  unsigned int planeAbsoluteDifferences[3] = {0u, 0u, 0u};
322  determine<uint8_t, 3u>(firstFrame.constdata<uint8_t>(planeIndex), secondFrame.constdata<uint8_t>(planeIndex), firstFrame.planeWidth(planeIndex), firstFrame.planeHeight(planeIndex), planeAbsoluteDifferences, firstFrame.paddingElements(planeIndex), secondFrame.paddingElements(planeIndex));
323  absoluteDifferences.emplace_back(planeAbsoluteDifferences[0]);
324  absoluteDifferences.emplace_back(planeAbsoluteDifferences[1]);
325  absoluteDifferences.emplace_back(planeAbsoluteDifferences[2]);
326  break;
327  }
328 
329  case 4u:
330  {
331  unsigned int planeAbsoluteDifferences[4] = {0u, 0u, 0u, 0u};
332  determine<uint8_t, 4u>(firstFrame.constdata<uint8_t>(planeIndex), secondFrame.constdata<uint8_t>(planeIndex), firstFrame.planeWidth(planeIndex), firstFrame.planeHeight(planeIndex), planeAbsoluteDifferences, firstFrame.paddingElements(planeIndex), secondFrame.paddingElements(planeIndex));
333  absoluteDifferences.emplace_back(planeAbsoluteDifferences[0]);
334  absoluteDifferences.emplace_back(planeAbsoluteDifferences[1]);
335  absoluteDifferences.emplace_back(planeAbsoluteDifferences[2]);
336  absoluteDifferences.emplace_back(planeAbsoluteDifferences[3]);
337  break;
338  }
339 
340  default:
341  ocean_assert(false && "Invalid channel number!");
342  return false;
343  }
344  }
345 
346  return true;
347 }
348 
349 }
350 
351 }
352 
353 #endif // META_OCEAN_CV_SUM_ABSOLUTE_DIFFERENCES_H
unsigned long long Type
Definition of the data type for the absolute difference value.
Definition: DataType.h:225
This class implements several sum of absolute differences functions.
Definition: SumAbsoluteDifferencesBase.h:25
This class implements functions calculation the sum of absolute differences.
Definition: SumAbsoluteDifferences.h:31
static uint32_t patchMirroredBorder8BitPerChannel(const uint8_t *image0, const uint8_t *image1, const unsigned int width0, const unsigned int height0, const unsigned int width1, const unsigned int height1, const unsigned int centerX0, const unsigned int centerY0, const unsigned int centerX1, const unsigned int centerY1, const unsigned int image0PaddingElements, const unsigned int image1PaddingElements)
Returns the sum of absolute differences between two patches within an image, patch pixels outside the...
Definition: SumAbsoluteDifferences.h:236
static uint32_t buffer8BitPerChannel(const uint8_t *buffer0, const uint8_t *buffer1)
Returns the sum of square differences between two memory buffers.
Definition: SumAbsoluteDifferences.h:209
static void determine(const T *firstFrame, const T *secondFrame, const unsigned int width, const unsigned int height, typename AbsoluteDifferenceValueTyper< T >::Type *absoluteDifferences, const unsigned int firstFramePaddingElements, const unsigned int secondFramePaddingElements)
Determines the sum of absolute differences between two individual frames, individually for each chann...
Definition: SumAbsoluteDifferences.h:245
static uint32_t patch8BitPerChannel(const uint8_t *const image0, const uint8_t *const image1, const unsigned int width0, const unsigned int width1, const unsigned int centerX0, const unsigned int centerY0, const unsigned int centerX1, const unsigned int centerY1, const unsigned int image0PaddingElements, const unsigned int image1PaddingElements)
Returns the sum of absolute differences between two square image patches.
Definition: SumAbsoluteDifferences.h:126
static uint32_t patchBuffer8BitPerChannel(const uint8_t *const image0, const unsigned int width0, const unsigned int centerX0, const unsigned int centerY0, const unsigned int image0PaddingElements, const uint8_t *const buffer1)
Returns the sum of absolute differences between an image patch and a memory buffer.
Definition: SumAbsoluteDifferences.h:170
T Type
Definition of the data type for the signed difference value.
Definition: DataType.h:176
This class implements Ocean's image class.
Definition: Frame.h:1760
const T * constdata(const unsigned int planeIndex=0u) const
Returns a pointer to the read-only pixel data of a specific plane.
Definition: Frame.h:4136
const FrameType & frameType() const
Returns the frame type of this frame.
Definition: Frame.h:3743
bool isValid() const
Returns whether this frame is valid.
Definition: Frame.h:4416
unsigned int planeChannels(const unsigned int planeIndex) const
Returns the channels of a plane of this frame.
Definition: Frame.h:4058
unsigned int planeWidth(const unsigned int planeIndex) const
Returns the width of a plane of this frame.
Definition: Frame.h:4042
unsigned int planeHeight(const unsigned int planeIndex) const
Returns the height of a plane of this frame.
Definition: Frame.h:4050
unsigned int paddingElements(const unsigned int planeIndex=0u) const
Returns the optional number of padding elements at the end of each row for a specific plane.
Definition: Frame.h:4010
uint32_t numberPlanes() const
Returns the number of planes of the pixel format of this frame.
Definition: Frame.h:3151
@ DT_UNSIGNED_INTEGER_8
Unsigned 8 bit integer data type (uint8_t).
Definition: Frame.h:41
DataType dataType() const
Returns the data type of the pixel format of this frame.
Definition: Frame.h:3131
This class provides basic numeric functionalities.
Definition: Numeric.h:57
std::vector< Index32 > Indices32
Definition of a vector holding 32 bit index values.
Definition: Base.h:96
The namespace covering the entire Ocean framework.
Definition: Accessor.h:15