8 #ifndef META_OCEAN_CV_FRAME_MIN_MAX_H
9 #define META_OCEAN_CV_FRAME_MIN_MAX_H
56 template <
bool tDetermineMinimum>
57 static void determineExtremumValue(
const T* frame,
const unsigned int width,
const unsigned int height,
const unsigned int framePaddingElements, T* extremumValue =
nullptr,
PixelPosition* extremumLocation =
nullptr);
76 static void determineMinValue(
const T* frame,
const unsigned int width,
const unsigned int height,
const unsigned int framePaddingElements, T* minValue =
nullptr,
PixelPosition* minLocation =
nullptr);
92 static void determineMaxValue(
const T* frame,
const unsigned int width,
const unsigned int height,
const unsigned int framePaddingElements, T* maxValue =
nullptr,
PixelPosition* maxLocation =
nullptr);
108 template <
typename T,
unsigned int tChannels,
bool tIgnoreInfinity = false>
109 static inline void determineMinMaxValues(
const T* frame,
const unsigned int width,
const unsigned int height,
const unsigned int framePaddingElements, T* minimalValues, T* maximalValues,
Worker* worker =
nullptr);
123 template <
typename T>
124 static bool countElementsOutsideRange(
const T* frame,
const uint32_t width,
const uint32_t height,
const uint32_t framePaddingElements,
const T rangeStart,
const T rangeEnd, uint32_t* elementsBelowRange =
nullptr, uint32_t* elementsAboveRange =
nullptr);
143 template <
typename T,
unsigned int tChannels,
bool tIgnoreInfinity = false>
144 static void determineMinMaxValuesSubset(
const T* frame,
const unsigned int width,
const unsigned int height, T* minimalValues, T* maximalValues,
Lock* lock,
const unsigned int framePaddingElements,
const unsigned int firstRow,
const unsigned int numberRows);
147 template <
typename T>
148 template <
bool tDetermineMinimum>
151 ocean_assert(frame !=
nullptr);
152 ocean_assert(width != 0u && height != 0u);
154 ocean_assert_accuracy(extremumValue !=
nullptr || extremumLocation !=
nullptr);
156 const unsigned int frameStrideElements = width + framePaddingElements;
158 T internalExtremumValue = frame[0];
161 for (
unsigned int y = 0u; y < height; ++y)
163 for (
unsigned int x = 0u; x < width; ++x)
165 if (tDetermineMinimum ? (frame[x] < internalExtremumValue) : (frame[x] > internalExtremumValue))
167 internalExtremumValue = frame[x];
172 frame += frameStrideElements;
177 *extremumValue = internalExtremumValue;
180 if (extremumLocation)
182 *extremumLocation = internalExtremumLocation;
186 #if defined(OCEAN_HARDWARE_NEON_VERSION) && OCEAN_HARDWARE_NEON_VERSION >= 10
189 template <
bool tDetermineMinimum>
192 ocean_assert(frame !=
nullptr);
193 ocean_assert(width != 0u && height != 0u);
195 ocean_assert_accuracy(extremumValue !=
nullptr || extremumLocation !=
nullptr);
197 const unsigned int frameStrideElements = width + framePaddingElements;
199 unsigned char internalExtremumValue = frame[0];
202 if (width >= 16u && width < 65535u && height < 65535u)
219 const uint16x8_t constant_01234567_u_16x8 = {0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u};
221 const uint16x8_t constant_8_u_16x8 = vdupq_n_u16(8u);
223 const uint16x8_t constant_16_u_16x8 = vdupq_n_u16(16u);
226 uint16x8_t extremumLocationX_01234567_u_16x8 = constant_01234567_u_16x8;
227 uint16x8_t extremumLocationX_89ABCDEF_u_16x8 = vaddq_u16(constant_01234567_u_16x8, constant_8_u_16x8);
229 uint16x8_t extremumLocationY_01234567_u_16x8 = vdupq_n_u16(0u);
230 uint16x8_t extremumLocationY_89ABCDEF_u_16x8 = vdupq_n_u16(0u);
232 uint8x16_t extremumValue_u_8x16 = vld1q_u8(frame + 0);
234 for (
unsigned int y = 0u; y < height; ++y)
237 const uint16x8_t candidateLocation_y_u_16x8 = vdupq_n_u16(uint16_t(y));
240 uint16x8_t candidateLocation_01234567_x_u_16x8 = constant_01234567_u_16x8;
241 uint16x8_t candidateLocation_89ABCDEF_x_u_16x8 = vaddq_u16(constant_01234567_u_16x8, constant_8_u_16x8);
243 for (
unsigned int x = 0u; x < width; x += 16u)
250 ocean_assert(x >= 16u && width > 16u);
251 const unsigned int newX = width - 16u;
253 ocean_assert(x > newX);
254 const unsigned int offset = x - newX;
255 ocean_assert(offset < 16u);
259 candidateLocation_01234567_x_u_16x8 = vsubq_u16(candidateLocation_01234567_x_u_16x8, vdupq_n_u16(uint16_t(offset)));
260 candidateLocation_89ABCDEF_x_u_16x8 = vsubq_u16(candidateLocation_89ABCDEF_x_u_16x8, vdupq_n_u16(uint16_t(offset)));
263 ocean_assert(!(x + 16u < width));
266 const uint8x16_t candidates_u_8x16 = vld1q_u8(frame + x);
273 const uint8x16_t mask_u_8x16 = tDetermineMinimum ? vcltq_u8(candidates_u_8x16, extremumValue_u_8x16) : vcgtq_u8(candidates_u_8x16, extremumValue_u_8x16);
276 extremumValue_u_8x16 = vbslq_u8(mask_u_8x16, candidates_u_8x16, extremumValue_u_8x16);
279 uint16x8_t mask_01234567_u_16x8 = vmovl_u8(vget_low_u8(mask_u_8x16));
280 uint16x8_t mask_89ABCDEF_u_16x8 = vmovl_u8(vget_high_u8(mask_u_8x16));
281 mask_01234567_u_16x8 = vorrq_u16(mask_01234567_u_16x8, vshlq_n_u16(mask_01234567_u_16x8, 8));
282 mask_89ABCDEF_u_16x8 = vorrq_u16(mask_89ABCDEF_u_16x8, vshlq_n_u16(mask_89ABCDEF_u_16x8, 8));
285 extremumLocationX_01234567_u_16x8 = vbslq_u16(mask_01234567_u_16x8, candidateLocation_01234567_x_u_16x8, extremumLocationX_01234567_u_16x8);
286 extremumLocationX_89ABCDEF_u_16x8 = vbslq_u16(mask_89ABCDEF_u_16x8, candidateLocation_89ABCDEF_x_u_16x8, extremumLocationX_89ABCDEF_u_16x8);
289 extremumLocationY_01234567_u_16x8 = vbslq_u16(mask_01234567_u_16x8, candidateLocation_y_u_16x8, extremumLocationY_01234567_u_16x8);
290 extremumLocationY_89ABCDEF_u_16x8 = vbslq_u16(mask_89ABCDEF_u_16x8, candidateLocation_y_u_16x8, extremumLocationY_89ABCDEF_u_16x8);
293 candidateLocation_01234567_x_u_16x8 = vaddq_u16(candidateLocation_01234567_x_u_16x8, constant_16_u_16x8);
294 candidateLocation_89ABCDEF_x_u_16x8 = vaddq_u16(candidateLocation_89ABCDEF_x_u_16x8, constant_16_u_16x8);
297 frame += frameStrideElements;
302 const uint8x8_t extremumValue_01234567_u_8x8 = vget_low_u8(extremumValue_u_8x16);
303 const uint8x8_t extremumValue_89ABCDEF_u_8x8 = vget_high_u8(extremumValue_u_8x16);
305 const uint8x8_t mask_u_8x8 = tDetermineMinimum ? vclt_u8(extremumValue_01234567_u_8x8, extremumValue_89ABCDEF_u_8x8) : vcgt_u8(extremumValue_01234567_u_8x8, extremumValue_89ABCDEF_u_8x8);
306 const uint8x8_t extremumValue_u_8x8 = vbsl_u8(mask_u_8x8, extremumValue_01234567_u_8x8, extremumValue_89ABCDEF_u_8x8);
308 uint16x8_t mask_u_16x8 = vmovl_u8(mask_u_8x8);
309 mask_u_16x8 = vorrq_u16(mask_u_16x8, vshlq_n_u16(mask_u_16x8, 8));
311 const uint16x8_t extremumLocationX_u_16x8 = vbslq_u16(mask_u_16x8, extremumLocationX_01234567_u_16x8, extremumLocationX_89ABCDEF_u_16x8);
312 const uint16x8_t extremumLocationY_u_16x8 = vbslq_u16(mask_u_16x8, extremumLocationY_01234567_u_16x8, extremumLocationY_89ABCDEF_u_16x8);
316 uint16_t extremumLocationsX[8];
317 vst1q_u16(extremumLocationsX, extremumLocationX_u_16x8);
319 uint16_t extremumLocationsY[8];
320 vst1q_u16(extremumLocationsY, extremumLocationY_u_16x8);
322 unsigned char extremumValues[8];
323 vst1_u8(extremumValues, extremumValue_u_8x8);
325 internalExtremumValue = extremumValues[0];
326 internalExtremumLocation =
CV::PixelPosition((
unsigned int)(extremumLocationsX[0]), (
unsigned int)(extremumLocationsY[0]));
328 for (
unsigned int n = 1u; n < 8u; ++n)
330 if (tDetermineMinimum ? (extremumValues[n] < internalExtremumValue) : (extremumValues[n] > internalExtremumValue))
332 internalExtremumValue = extremumValues[n];
333 internalExtremumLocation =
CV::PixelPosition((
unsigned int)(extremumLocationsX[n]), (
unsigned int)(extremumLocationsY[n]));
339 for (
unsigned int y = 0u; y < height; ++y)
341 for (
unsigned int x = 0u; x < width; ++x)
343 if (tDetermineMinimum ? (frame[x] < internalExtremumValue) : (frame[x] > internalExtremumValue))
345 internalExtremumValue = frame[x];
350 frame += frameStrideElements;
356 *extremumValue = internalExtremumValue;
359 if (extremumLocation)
361 *extremumLocation = internalExtremumLocation;
366 template <
bool tDetermineMinimum>
369 ocean_assert(frame !=
nullptr);
370 ocean_assert(width != 0u && height != 0u);
372 ocean_assert_accuracy(extremumValue !=
nullptr || extremumLocation !=
nullptr);
374 const unsigned int frameStrideElements = width + framePaddingElements;
376 float internalExtremumValue = frame[0];
396 const uint32x4_t constant_0123_u_32x4 = {0u, 1u, 2u, 3u};
398 const uint32x4_t constant_4_u_32x4 = vdupq_n_u32(4u);
400 const uint32x4_t constant_8_u_32x4 = vdupq_n_u32(8u);
403 uint32x4_t extremumLocationX_0123_u_32x4 = constant_0123_u_32x4;
404 uint32x4_t extremumLocationX_4567_u_32x4 = vaddq_u32(constant_0123_u_32x4, constant_4_u_32x4);
406 uint32x4_t extremumLocationY_0123_u_32x4 = vdupq_n_u32(0u);
407 uint32x4_t extremumLocationY_4567_u_32x4 = vdupq_n_u32(0u);
409 float32x4_t extremumValue_0123_f_32x4 = vld1q_f32(frame + 0);
410 float32x4_t extremumValue_4567_f_32x4 = vld1q_f32(frame + 4);
412 for (
unsigned int y = 0u; y < height; ++y)
415 const uint32x4_t candidateLocation_y_u_32x4 = vdupq_n_u32(y);
418 uint32x4_t candidateLocation_0123_x_u_32x4 = constant_0123_u_32x4;
419 uint32x4_t candidateLocation_4567_x_u_32x4 = vaddq_u32(constant_0123_u_32x4, constant_4_u_32x4);
421 for (
unsigned int x = 0u; x < width; x += 8u)
428 ocean_assert(x >= 8u && width > 8u);
429 const unsigned int newX = width - 8u;
431 ocean_assert(x > newX);
432 const unsigned int offset = x - newX;
433 ocean_assert(offset < 8u);
437 candidateLocation_0123_x_u_32x4 = vsubq_u32(candidateLocation_0123_x_u_32x4, vdupq_n_u32(offset));
438 candidateLocation_4567_x_u_32x4 = vsubq_u32(candidateLocation_4567_x_u_32x4, vdupq_n_u32(offset));
441 ocean_assert(!(x + 8u < width));
444 const float32x4_t candidates_0123_f_32x4 = vld1q_f32(frame + x + 0u);
445 const float32x4_t candidates_4567_f_32x4 = vld1q_f32(frame + x + 4u);
452 const uint32x4_t mask_0123_u_32x4 = tDetermineMinimum ? vcltq_f32(candidates_0123_f_32x4, extremumValue_0123_f_32x4) : vcgtq_f32(candidates_0123_f_32x4, extremumValue_0123_f_32x4);
453 const uint32x4_t mask_4567_u_32x4 = tDetermineMinimum ? vcltq_f32(candidates_4567_f_32x4, extremumValue_4567_f_32x4) : vcgtq_f32(candidates_4567_f_32x4, extremumValue_4567_f_32x4);
456 extremumValue_0123_f_32x4 = vbslq_f32(mask_0123_u_32x4, candidates_0123_f_32x4, extremumValue_0123_f_32x4);
457 extremumValue_4567_f_32x4 = vbslq_f32(mask_4567_u_32x4, candidates_4567_f_32x4, extremumValue_4567_f_32x4);
459 extremumLocationX_0123_u_32x4 = vbslq_u32(mask_0123_u_32x4, candidateLocation_0123_x_u_32x4, extremumLocationX_0123_u_32x4);
460 extremumLocationX_4567_u_32x4 = vbslq_u32(mask_4567_u_32x4, candidateLocation_4567_x_u_32x4, extremumLocationX_4567_u_32x4);
462 extremumLocationY_0123_u_32x4 = vbslq_u32(mask_0123_u_32x4, candidateLocation_y_u_32x4, extremumLocationY_0123_u_32x4);
463 extremumLocationY_4567_u_32x4 = vbslq_u32(mask_4567_u_32x4, candidateLocation_y_u_32x4, extremumLocationY_4567_u_32x4);
466 candidateLocation_0123_x_u_32x4 = vaddq_u32(candidateLocation_0123_x_u_32x4, constant_8_u_32x4);
467 candidateLocation_4567_x_u_32x4 = vaddq_u32(candidateLocation_4567_x_u_32x4, constant_8_u_32x4);
470 frame += frameStrideElements;
473 const uint32x4_t mask_u_32x4 = tDetermineMinimum ? vcltq_f32(extremumValue_0123_f_32x4, extremumValue_4567_f_32x4) : vcgtq_f32(extremumValue_0123_f_32x4, extremumValue_4567_f_32x4);
474 extremumValue_0123_f_32x4 = vbslq_f32(mask_u_32x4, extremumValue_0123_f_32x4, extremumValue_4567_f_32x4);
475 extremumLocationX_0123_u_32x4 = vbslq_u32(mask_u_32x4, extremumLocationX_0123_u_32x4, extremumLocationX_4567_u_32x4);
476 extremumLocationY_0123_u_32x4 = vbslq_u32(mask_u_32x4, extremumLocationY_0123_u_32x4, extremumLocationY_4567_u_32x4);
480 unsigned int extremumLocationsX[4];
481 vst1q_u32(extremumLocationsX, extremumLocationX_0123_u_32x4);
483 unsigned int extremumLocationsY[4];
484 vst1q_u32(extremumLocationsY, extremumLocationY_0123_u_32x4);
486 float extremumValues[4];
487 vst1q_f32(extremumValues, extremumValue_0123_f_32x4);
489 internalExtremumValue = extremumValues[0];
490 internalExtremumLocation =
CV::PixelPosition(extremumLocationsX[0], extremumLocationsY[0]);
492 for (
unsigned int n = 1u; n < 4u; ++n)
494 if (tDetermineMinimum ? (extremumValues[n] < internalExtremumValue) : (extremumValues[n] > internalExtremumValue))
496 internalExtremumValue = extremumValues[n];
497 internalExtremumLocation =
CV::PixelPosition(extremumLocationsX[n], extremumLocationsY[n]);
503 for (
unsigned int y = 0u; y < height; ++y)
505 for (
unsigned int x = 0u; x < width; ++x)
507 if (tDetermineMinimum ? (frame[x] < internalExtremumValue) : (frame[x] > internalExtremumValue))
509 internalExtremumValue = frame[x];
514 frame += frameStrideElements;
520 *extremumValue = internalExtremumValue;
523 if (extremumLocation)
525 *extremumLocation = internalExtremumLocation;
531 template <
typename T>
537 template <
typename T>
543 template <
typename T,
unsigned int tChannels,
bool tIgnoreInfinity>
546 static_assert(tChannels >= 1u,
"Invalid channel number!");
548 ocean_assert(frame !=
nullptr && minimalValues !=
nullptr && maximalValues !=
nullptr);
549 ocean_assert(width >= 1u && height >= 1u);
551 for (
unsigned int n = 0u; n < tChannels; ++n)
556 for (
unsigned int n = 0u; n < tChannels; ++n)
564 worker->
executeFunction(
Worker::Function::createStatic(determineMinMaxValuesSubset<T, tChannels, tIgnoreInfinity>, frame, width, height, minimalValues, maximalValues, &lock, framePaddingElements, 0u, 0u), 0u, height, 7u, 8u, 20u);
568 determineMinMaxValuesSubset<T, tChannels, tIgnoreInfinity>(frame, width, height, minimalValues, maximalValues,
nullptr, framePaddingElements, 0u, height);
572 #if defined(OCEAN_HARDWARE_NEON_VERSION) && OCEAN_HARDWARE_NEON_VERSION >= 10
576 bool FrameMinMax::countElementsOutsideRange<uint8_t>(
const uint8_t* frame,
const uint32_t width,
const uint32_t height,
const uint32_t framePaddingElements,
const uint8_t rangeStart,
const uint8_t rangeEnd, uint32_t* elementsBelowRange, uint32_t* elementsAboveRange);
580 template <
typename T>
581 bool FrameMinMax::countElementsOutsideRange(
const T* frame,
const uint32_t width,
const uint32_t height,
const uint32_t framePaddingElements,
const T rangeStart,
const T rangeEnd, uint32_t* elementsBelowRange, uint32_t* elementsAboveRange)
583 if (frame ==
nullptr || width == 0u || height == 0u || rangeStart > rangeEnd || (elementsBelowRange ==
nullptr && elementsAboveRange ==
nullptr))
585 ocean_assert(
false &&
"Invalid input");
589 const uint32_t frameStrideElements = width + framePaddingElements;
590 const T*
const frameEnd = frame + height * frameStrideElements - framePaddingElements;
592 uint32_t elementsBelowRangeLocal = 0u;
593 uint32_t elementsAboveRangeLocal = 0u;
595 if (framePaddingElements == 0u)
597 while (frame < frameEnd)
599 if (*frame < rangeStart)
601 ++elementsBelowRangeLocal;
603 else if (*frame >= rangeEnd)
605 ++elementsAboveRangeLocal;
613 for (uint32_t y = 0u; y < height; ++y)
615 const T* frameRowEnd = frame + width;
617 while (frame < frameRowEnd)
619 if (*frame < rangeStart)
621 ++elementsBelowRangeLocal;
623 else if (*frame >= rangeEnd)
625 ++elementsAboveRangeLocal;
631 frame += framePaddingElements;
635 if (elementsBelowRange)
637 *elementsBelowRange = elementsBelowRangeLocal;
640 if (elementsAboveRange)
642 *elementsAboveRange = elementsAboveRangeLocal;
648 template <
typename T,
unsigned int tChannels,
bool tIgnoreInfinity>
649 void FrameMinMax::determineMinMaxValuesSubset(
const T* frame,
const unsigned int width,
const unsigned int height, T* minimalValues, T* maximalValues,
Lock* lock,
const unsigned int framePaddingElements,
const unsigned int firstRow,
const unsigned int numberRows)
651 static_assert(tChannels >= 1u,
"Invalid channel number!");
653 ocean_assert(frame !=
nullptr && minimalValues !=
nullptr && maximalValues !=
nullptr);
654 ocean_assert(width >= 1u && height >= 1u);
655 ocean_assert_and_suppress_unused(firstRow + numberRows <= height, height);
657 T localMinimal[tChannels];
658 for (
unsigned int n = 0u; n < tChannels; ++n)
663 T localMaximal[tChannels];
664 for (
unsigned int n = 0u; n < tChannels; ++n)
669 const unsigned int frameStrideElements = width * tChannels + framePaddingElements;
671 frame += firstRow * frameStrideElements;
673 const T*
const frameEnd = frame + numberRows * frameStrideElements;
674 while (frame != frameEnd)
676 ocean_assert(frame < frameEnd);
678 const T*
const frameRowEnd = frame + width * tChannels;
680 while (frame != frameRowEnd)
682 ocean_assert(frame < frameRowEnd);
683 ocean_assert(frame < frameEnd);
685 for (
unsigned int n = 0u; n < tChannels; ++n)
687 if constexpr (tIgnoreInfinity && std::is_floating_point<T>::value)
691 if (frame[n] < localMinimal[n])
693 localMinimal[n] = frame[n];
696 if (frame[n] > localMaximal[n])
698 localMaximal[n] = frame[n];
704 if (frame[n] < localMinimal[n])
706 localMinimal[n] = frame[n];
709 if (frame[n] > localMaximal[n])
711 localMaximal[n] = frame[n];
719 frame += framePaddingElements;
724 for (
unsigned int n = 0u; n < tChannels; ++n)
726 minimalValues[n] = min(minimalValues[n], localMinimal[n]);
727 maximalValues[n] = max(maximalValues[n], localMaximal[n]);
This class allows to determine the extremum (the global minimum or maximum) within a given frame.
Definition: FrameMinMax.h:41
static void determineExtremumValue(const T *frame, const unsigned int width, const unsigned int height, const unsigned int framePaddingElements, T *extremumValue=nullptr, PixelPosition *extremumLocation=nullptr)
Determines the extremum minimum value (either the global minimum or the global maximum) within a give...
Definition: FrameMinMax.h:149
This class implements functions allowing to determine minimum and maximum values within frames.
Definition: FrameMinMax.h:30
static void determineMaxValue(const T *frame, const unsigned int width, const unsigned int height, const unsigned int framePaddingElements, T *maxValue=nullptr, PixelPosition *maxLocation=nullptr)
Determines the maximum value (the peak value) within a given frame with one channel.
Definition: FrameMinMax.h:538
static bool countElementsOutsideRange(const T *frame, const uint32_t width, const uint32_t height, const uint32_t framePaddingElements, const T rangeStart, const T rangeEnd, uint32_t *elementsBelowRange=nullptr, uint32_t *elementsAboveRange=nullptr)
Counts frame elements in a 1-channel frame that are outside a specified range of values.
Definition: FrameMinMax.h:581
static void determineMinValue(const T *frame, const unsigned int width, const unsigned int height, const unsigned int framePaddingElements, T *minValue=nullptr, PixelPosition *minLocation=nullptr)
Determines the minimum value (the global minimum) within a given frame with one channel.
Definition: FrameMinMax.h:532
static void determineMinMaxValuesSubset(const T *frame, const unsigned int width, const unsigned int height, T *minimalValues, T *maximalValues, Lock *lock, const unsigned int framePaddingElements, const unsigned int firstRow, const unsigned int numberRows)
Determines the minimal and maximal pixel values in a subset of a given frame.
Definition: FrameMinMax.h:649
static void determineMinMaxValues(const T *frame, const unsigned int width, const unsigned int height, const unsigned int framePaddingElements, T *minimalValues, T *maximalValues, Worker *worker=nullptr)
Determines the minimal and maximal pixel values in a given frame.
Definition: FrameMinMax.h:544
static Caller< void > createStatic(typename StaticFunctionPointerMaker< void, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass, NullClass >::Type function)
Creates a new caller container for a static function with no function parameter.
Definition: Caller.h:2876
This class implements a recursive lock object.
Definition: Lock.h:31
This class provides basic numeric functionalities.
Definition: Numeric.h:57
static constexpr T minValue()
Returns the min scalar value.
Definition: Numeric.h:3250
static constexpr T maxValue()
Returns the max scalar value.
Definition: Numeric.h:3244
This class implements an optional recursive scoped lock object locking the lock object only if it's d...
Definition: Lock.h:325
This class implements a worker able to distribute function calls over different threads.
Definition: Worker.h:33
bool executeFunction(const Function &function, const unsigned int first, const unsigned int size, const unsigned int firstIndex=(unsigned int)(-1), const unsigned int sizeIndex=(unsigned int)(-1), const unsigned int minimalIterations=1u, const unsigned int threadIndex=(unsigned int)(-1))
Executes a callback function separable by two function parameters.
PixelPositionT< unsigned int > PixelPosition
Definition of the default PixelPosition object with a data type allowing only positive coordinate val...
Definition: PixelPosition.h:27
The namespace covering the entire Ocean framework.
Definition: Accessor.h:15