Ocean
Loading...
Searching...
No Matches
FramePyramid.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_FRAME_PYRAMID_H
9#define META_OCEAN_CV_FRAME_PYRAMID_H
10
11#include "ocean/cv/CV.h"
12
13#include "ocean/base/Callback.h"
14#include "ocean/base/Frame.h"
15#include "ocean/base/Memory.h"
16#include "ocean/base/Worker.h"
17
20
21#include <functional>
22
23namespace Ocean
24{
25
26namespace CV
27{
28
29/**
30 * This class implements a frame pyramid.<br>
31 * A frame pyramid holds the same frame with several scale spaces.<br>
32 * Each further layer holds the frame with half size (half width and half height).<br>
33 * The finest layer has index 0 and the coarsest layer has the highest index.
34 * @ingroup cv
35 */
36class OCEAN_CV_EXPORT FramePyramid
37{
38 public:
39
40 /**
41 * Definition of individual down sampling modes.
42 */
43 enum DownsamplingMode : uint32_t
44 {
45 /**
46 * Down sampling is realized by a 2x2 averaging filter.
47 * This down sampling mode is the fastest mode available, as 2x2 pixel blocks are simply averaged.<br>
48 * The corresponding filter mask has the following layout:
49 * <pre>
50 * | 1 1 |
51 * | 1 1 | * 1/4
52 * </pre>
53 * The upper left filter element is applied to every even pixel location in the source frame.<br>
54 * In case, the width or height of a given frame is odd, the last column/row will apply a 121 filter.
55 */
57
58 /**
59 * Down sampling is realized by a 5x5 Gaussian filter.
60 * This down sampling mode is more expensive but reduces aliasing effects on down sampled images.<br>
61 * The corresponding filter mask has the following layout:
62 * <pre>
63 * | 1 4 6 4 1 |
64 * | 4 16 24 16 4 |
65 * | 6 24 36 24 6 | * 1/256
66 * | 4 16 24 16 4 |
67 * | 1 4 6 4 1 |
68 * </pre>
69 * The center of the filter is applied to every even pixel location in the source frame.<br>
70 * At the border of frames, the filter responses are determined based on mirrored pixel values.
71 */
72 DM_FILTER_14641
73 };
74
75 /**
76 * Definition of a function allowing to downsample a frame.
77 * @param sourceLayer The source layer to downsample
78 * @param targetLayer The target layer reviving the downsampled image content
79 * @param worker Optional worker to distribute the computation
80 * @return True, if succeeded
81 */
82 using DownsamplingFunction = std::function<bool(const Frame& sourceLayer, Frame& targetLayer, Worker* worker)>;
83
84 /**
85 * Definition of a value that can be used to create as many pyramid layers as possible (so that the coarsest pyramid layer has resolution 1x1).
86 */
87 static constexpr unsigned int AS_MANY_LAYERS_AS_POSSIBLE = (unsigned int)(-1);
88
89 protected:
90
91 /// The number of bytes for memory alignment.
92 static constexpr size_t memoryAlignmentBytes_ = 8;
93
94 public:
95
96 /**
97 * Creates an empty frame pyramid object.
98 */
99 inline FramePyramid();
100
101 /**
102 * Copy constructor.
103 * @param framePyramid Frame pyramid to be copied
104 * @param copyData True, to copy the image content of the frame pyramid; False, to only reuse the image content of the frame pyramid
105 */
106 FramePyramid(const FramePyramid& framePyramid, const bool copyData);
107
108 /**
109 * Move constructor.
110 * @param framePyramid Frame pyramid to be moved
111 */
112 FramePyramid(FramePyramid&& framePyramid) noexcept;
113
114 /**
115 * Creates a frame pyramid object for a given frame type and layer number.
116 * The resulting pyramid may have fewer layers than desired.<br>
117 * The image content of the replaced frame pyramid will be uninitialized.
118 * @param layers The preferred number of layers to be created, with range [1, infinity), AS_MANY_LAYERS_AS_POSSIBLE to create as may layers as possible
119 * @param frameType Type of the frame to create a frame pyramid for, must be valid
120 */
121 explicit FramePyramid(const unsigned int layers, const FrameType& frameType);
122
123 /**
124 * Creates a new pyramid frame for frames with 1 plane and data type DT_UNSIGNED_INTEGER_8 applying a 1-1 downsampling.
125 * This constructor is intentionally restrictive to reduce binary impact when used, use other constructors or functions in case more flexibility is needed an binary size does not matter.<br>
126 * The constructor mainly calls replace8BitPerChannel11().
127 * @param frame The frame for which the pyramid will be created, must be valid
128 * @param width The width of the given frame in pixel, with range [1, infinity)
129 * @param height The height of the given frame in pixel, with range [1, infinity)
130 * @param channels The number of channels the given frame has, with range [1, infinity)
131 * @param pixelOrigin The pixel origin of the given frame
132 * @param layers Number of pyramid layers to be created, with range [1, infinity)
133 * @param framePaddingElements The number of padding elements at the end of each frame row, in elements, with range [0, infinity)
134 * @param copyFirstLayer True, to copy the memory of the first layer into the pyramid; False, to re-use the memory of the first layer only (in this case, ensure that the memory of the first layer exists as long as this pyramid exist)
135 * @param worker Optional worker object to distribute the computation
136 * @param pixelFormat The explicit pixel format which will be used for each pyramid layer, must be compatible with DT_UNSIGNED_INTEGER_8 and 'channels'; FORMAT_UNDEFINED to use a generic pixel format
137 * @param timestamp Timestamp to be assigned to the frame pyramid (e.g., the timestamp of the frame used to created the timestamp)
138 * @see replace8BitPerChannel11().
139 */
140 inline FramePyramid(const uint8_t* frame, const unsigned int width, const unsigned int height, const unsigned int channels, const FrameType::PixelOrigin pixelOrigin, const unsigned int layers, const unsigned int framePaddingElements, const bool copyFirstLayer, Worker* worker = nullptr, const FrameType::PixelFormat pixelFormat = FrameType::FORMAT_UNDEFINED, const Timestamp timestamp = Timestamp(false));
141
142 /**
143 * Creates a new pyramid frame for frames with 1 plane and data type DT_UNSIGNED_INTEGER_8 applying a 1-1 downsampling.
144 * This constructor is intentionally restrictive to reduce binary impact when used, use other constructors or functions in case more flexibility is needed an binary size does not matter.<br>
145 * In case the provided frame not a valid 1-plane DT_UNSIGNED_INTEGER_8 frame, the pyramid will be invalid.<br>
146 * The constructor mainly calls replace8BitPerChannel11().
147 * @param frame The frame for which the pyramid will be created, with 1 plane and data type DT_UNSIGNED_INTEGER_8, must be valid
148 * @param layers Number of pyramid layers to be created, with range [1, infinity)
149 * @param copyFirstLayer True, to copy the memory of the first layer into the pyramid; False, to re-use the memory of the first layer only (in this case, ensure that the memory of the first layer exists as long as this pyramid exist)
150 * @param worker Optional worker object to distribute the computation
151 * @see replace8BitPerChannel11().
152 */
153 inline FramePyramid(const Frame& frame, const unsigned int layers, const bool copyFirstLayer, Worker* worker = nullptr);
154
155 /**
156 * Creates a frame pyramid based on a frame with 1 plane and data type DT_UNSIGNED_INTEGER_8 applying a custom downsampling.
157 * The resulting pyramid will contain a copy of the given frame (as finest pyramid layer) or will just use the memory, depending on 'copyFirstLayer'.<br>
158 * The constructor mainly calls replace8BitPerChannel().
159 * @param frame The frame for which the pyramid will be created, must be valid
160 * @param width The width of the frame in pixel, with range [1, infinity)
161 * @param height The height of the frame in pixel, with range [1, infinity)
162 * @param channels The number of channels the given frame has, with range [1, infinity)
163 * @param pixelOrigin The pixel origin of the given frame
164 * @param downsamplingMode The downsampling mode to use when creating the individual pyramid layers, must be valid
165 * @param layers Number of pyramid layers to be created, with range [1, infinity)
166 * @param framePaddingElements The number of padding elements at the end of each frame row, in elements, with range [0, infinity)
167 * @param copyFirstLayer True, to copy the memory of the first layer into the pyramid; False, to re-use the memory of the first layer only (in this case, ensure that the memory of the first layer exists as long as this pyramid exist)
168 * @param worker Optional worker object to distribute the computation
169 * @param pixelFormat The explicit pixel format which will be used for each pyramid layer, must be compatible with DT_UNSIGNED_INTEGER_8 and 'channels'; FORMAT_UNDEFINED to use a generic pixel format
170 * @param timestamp Timestamp to be assigned to the frame pyramid (e.g., the timestamp of the frame used to created the timestamp)
171 * @see replace8BitPerChannel().
172 */
173 inline FramePyramid(const uint8_t* frame, const unsigned int width, const unsigned int height, const unsigned int channels, const FrameType::PixelOrigin pixelOrigin, const DownsamplingMode downsamplingMode, const unsigned int layers, const unsigned int framePaddingElements, const bool copyFirstLayer, Worker* worker, const FrameType::PixelFormat pixelFormat = FrameType::FORMAT_UNDEFINED, const Timestamp timestamp = Timestamp(false));
174
175 /**
176 * Creates a frame pyramid based on a frame applying a custom downsampling.
177 * The resulting pyramid will contain a copy of the given frame (as finest pyramid layer) or will just use the memory, depending on 'copyFirstLayer'.
178 * @param frame The frame for which the pyramid will be created, must be valid
179 * @param downsamplingMode The downsampling mode to use when creating the individual pyramid layers, must be valid
180 * @param layers The number of pyramid layers to be created, with range [1, infinity)
181 * @param copyFirstLayer True, to copy the memory of the first layer into the pyramid; False, to re-use the memory of the first layer only (in this case,
182 * @param worker Optional worker object to distribute the computation
183 */
184 inline FramePyramid(const Frame& frame, const DownsamplingMode downsamplingMode, const unsigned int layers, const bool copyFirstLayer, Worker* worker);
185
186 /**
187 * Creates a frame pyramid based on a frame applying a custom downsampling.
188 * The resulting pyramid will contain a copy of the given frame (as finest pyramid layer) or will just use the memory, depending on 'copyFirstLayer'.
189 * @param frame The frame for which the pyramid will be created, must be valid
190 * @param downsamplingFunction The custom function used to downsample the individual pyramid layers, must be valid
191 * @param layers The number of pyramid layers to be created, with range [1, infinity)
192 * @param copyFirstLayer True, to copy the memory of the first layer into the pyramid; False, to re-use the memory of the first layer only (in this case,
193 * @param worker Optional worker object to distribute the computation
194 */
195 inline FramePyramid(const Frame& frame, const DownsamplingFunction& downsamplingFunction, const unsigned int layers, const bool copyFirstLayer, Worker* worker);
196
197 /**
198 * Creates a frame pyramid based on a frame applying a custom downsampling.
199 * The resulting pyramid will re-used the given frame (as finest pyramid layer); thus, ensure that the frame's memory is valid as long as this pyramid exists.
200 * @param downsamplingMode The downsampling mode to use when creating the individual pyramid layers, must be valid
201 * @param frame The frame for which the pyramid will be created, must be valid
202 * @param layers The number of pyramid layers to be created, with range [1, infinity)
203 * @param worker Optional worker object to distribute the computation
204 */
205 inline FramePyramid(const DownsamplingMode downsamplingMode, Frame&& frame, const unsigned int layers, Worker* worker);
206
207 /**
208 * Creates a frame pyramid based on a frame applying a custom downsampling.
209 * The resulting pyramid will re-used the given frame (as finest pyramid layer); thus, ensure that the frame's memory is valid as long as this pyramid exists.
210 * @param downsamplingFunction The custom function used to downsample the individual pyramid layers, must be valid
211 * @param frame The frame for which the pyramid will be created, must be valid
212 * @param layers The number of pyramid layers to be created, with range [1, infinity)
213 * @param worker Optional worker object to distribute the computation
214 */
215 inline FramePyramid(const DownsamplingFunction& downsamplingFunction, Frame&& frame, const unsigned int layers, Worker* worker);
216
217 /**
218 * Creates a new frame pyramid based on an existing frame pyramid.
219 * @param framePyramid The existing frame pyramid from which the new pyramid will be created, must be valid
220 * @param firstLayerIndex The index of the first layer to use from the source pyramid, with range [0, framePyramid.layers() - 1]
221 * @param layers The number of layers to use from the source pyramid, with range [1, infinity), AS_MANY_LAYERS_AS_POSSIBLE to use as many layers as exist
222 * @param copyData True, to make a copy of the image content of the existing pyramid; False, to only use the memory
223 */
224 FramePyramid(const FramePyramid& framePyramid, const unsigned int firstLayerIndex, const unsigned int layers, bool copyData);
225
226 /**
227 * Returns the frame of a specified layer.
228 * @param layer Index of the layer frame to be returned, with range [0, layers())
229 * @return Pyramid layer frame
230 */
231 inline const Frame& layer(const unsigned int layer) const;
232
233 /**
234 * Returns the frame of a specified layer.
235 * @param layer Index of the layer frame to be returned, with range [0, layers())
236 * @return Pyramid layer frame
237 */
238 inline Frame& layer(const unsigned int layer);
239
240 /**
241 * Returns the finest layer frame of this pyramid.
242 * Beware: The frame will not be the owner of the frame data, if you need a copy of this frame enforce to copy the frame buffer!
243 * @return Finest pyramid layer frame
244 */
245 inline const Frame& finestLayer() const;
246
247 /**
248 * Returns the coarsest layer frame of this pyramid.
249 * Beware: The frame will not be the owner of the frame data, if you need a copy of this frame enforce to copy the frame buffer!
250 * @return Finest pyramid layer frame
251 */
252 inline Frame& finestLayer();
253
254 /**
255 * Returns the coarsest layer frame of this pyramid regarding to the number of valid layers.
256 * If no valid layer is stored in this pyramid, the finest layer is used instead.<br>
257 * Beware: The frame will not be the owner of the frame data, if you need a copy of this frame enforce to copy the frame buffer!<br>
258 * @return Finest pyramid layer frame
259 */
260 inline const Frame& coarsestLayer() const;
261
262 /**
263 * Returns the finest layer frame of this pyramid regarding to the number of valid layers.
264 * If no valid layer is stored in this pyramid, the finest layer is used instead.<br>
265 * Beware: The frame will not be the owner of the frame data, if you need a copy of this frame enforce to copy the frame buffer!<br>
266 * @return Finest pyramid layer frame
267 */
268 inline Frame& coarsestLayer();
269
270 /**
271 * Returns the number of layers this pyramid holds.
272 * @return Pyramid layers, with range [0, infinity)
273 */
274 inline unsigned int layers() const;
275
276 /**
277 * Returns the width of a given layer.
278 * @param layer The layer to return the width for, with range [0, layers())
279 * @return Width in pixel
280 */
281 inline unsigned int width(const unsigned int layer) const;
282
283 /**
284 * Returns the height of a given layer.
285 * @param layer The layer to return the height for, with range [0, layers())
286 * @return Height in pixel
287 */
288 inline unsigned int height(const unsigned int layer) const;
289
290 /**
291 * Returns the width of the finest (first) layer.
292 * @return Width in pixel
293 */
294 inline unsigned int finestWidth() const;
295
296 /**
297 * Returns the height of the finest (first) layer.
298 * @return Height in pixel
299 */
300 inline unsigned int finestHeight() const;
301
302 /**
303 * Returns the width of the coarsest (last) layer regarding to the number of valid layers.
304 * If no valid layer is stored in this pyramid, the finest layer is used instead.
305 * @return Width in pixel
306 */
307 inline unsigned int coarsestWidth() const;
308
309 /**
310 * Returns the height of the coarsest (last) layer regarding to the number of valid layers.
311 * If no valid layer is stored in this pyramid, the finest layer is used instead.
312 * @return Height in pixel
313 */
314 inline unsigned int coarsestHeight() const;
315
316 /**
317 * Returns the size factor for the coarsest layer in relation to the finest layer regarding to the number of valid layers.
318 * If no valid layer is stored in this pyramid, the finest layer is used instead.
319 * @return Coarsest layer size factor
320 */
321 inline unsigned int coarsestSizeFactor() const;
322
323 /**
324 * Returns the frame type of the finest layer.
325 * Beware: Ensure that the pyramid holds at least one pyramid layer before calling this function.
326 * @return Frame type
327 */
328 inline const FrameType& frameType() const;
329
330 /**
331 * Replaces this frame pyramid based on a new frame.
332 * The function will re-used the existing pyramid's memory if possible.<br>
333 * The resulting pyramid will contain a copy of the given frame (as finest pyramid layer) or will just use the memory, depending on 'copyFirstLayer'.
334 * @param frame The frame for which the pyramid will be created, must be valid
335 * @param downsamplingMode The downsampling mode to use when creating the individual pyramid layers, must be valid
336 * @param layers The number of pyramid layers to be created, with range [1, infinity)
337 * @param copyFirstLayer True, to copy the memory of the first layer into the pyramid; False, to re-use the memory of the first layer only (in this case, ensure that the memory of the first layer exists as long as this pyramid exist)
338 * @param worker Optional worker object to distribute the computation
339 * @return True, if the frame pyramid was replaced
340 * @see replace8BitPerChannel11().
341 */
342 bool replace(const Frame& frame, const DownsamplingMode downsamplingMode, const unsigned int layers, const bool copyFirstLayer, Worker* worker);
343
344 /**
345 * Replaces this frame pyramid based on a new frame.
346 * The function will re-used the existing pyramid's memory if possible.<br>
347 * The resulting pyramid will contain a copy of the given frame (as finest pyramid layer) or will just use the memory, depending on 'copyFirstLayer'.
348 * @param frame The frame for which the pyramid will be created, must be valid
349 * @param downsamplingFunction The custom function used to downsample the individual pyramid layers, must be valid
350 * @param layers The number of pyramid layers to be created, with range [1, infinity)
351 * @param copyFirstLayer True, to copy the memory of the first layer into the pyramid; False, to re-use the memory of the first layer only (in this case, ensure that the memory of the first layer exists as long as this pyramid exist)
352 * @param worker Optional worker object to distribute the computation
353 * @return True, if the frame pyramid was replaced
354 * @see replace8BitPerChannel11().
355 */
356 bool replace(const Frame& frame, const DownsamplingFunction& downsamplingFunction, const unsigned int layers, const bool copyFirstLayer, Worker* worker);
357
358 /**
359 * Replaces this frame pyramid based on a new frame.
360 * The function will re-used the existing pyramid's memory if possible.<br>
361 * The resulting pyramid will re-used the given frame (as finest pyramid layer); thus, ensure that the frame's memory is valid as long as this pyramid exists.
362 * @param downsamplingMode The downsampling mode to use when creating the individual pyramid layers, must be valid
363 * @param frame The frame for which the pyramid will be created, must be valid
364 * @param layers The number of pyramid layers to be created, with range [1, infinity)
365 * @param worker Optional worker object to distribute the computation
366 * @return True, if the frame pyramid was replaced
367 * @see replace8BitPerChannel11().
368 */
369 bool replace(const DownsamplingMode downsamplingMode, Frame&& frame, const unsigned int layers, Worker* worker);
370
371 /**
372 * Replaces this frame pyramid based on a new frame.
373 * The function will re-used the existing pyramid's memory if possible.<br>
374 * The resulting pyramid will re-used the given frame (as finest pyramid layer); thus, ensure that the frame's memory is valid as long as this pyramid exists.
375 * @param downsamplingFunction The custom function used to downsample the individual pyramid layers, must be valid
376 * @param frame The frame for which the pyramid will be created, must be valid
377 * @param layers The number of pyramid layers to be created, with range [1, infinity)
378 * @param worker Optional worker object to distribute the computation
379 * @return True, if the frame pyramid was replaced
380 * @see replace8BitPerChannel11().
381 */
382 bool replace(const DownsamplingFunction& downsamplingFunction, Frame&& frame, const unsigned int layers, Worker* worker);
383
384 /**
385 * Replaces this frame pyramid based on a new frame.
386 * The function will re-used the existing pyramid's memory if possible.<br>
387 * The resulting pyramid will contain a copy of the given frame (as finest pyramid layer).
388 * @param frame The frame for which the pyramid will be created, must be valid
389 * @param width The width of the frame in pixel, with range [1, infinity)
390 * @param height The height of the frame in pixel, with range [1, infinity)
391 * @param channels The number of channels the given frame has, with range [1, infinity)
392 * @param pixelOrigin The pixel origin of the given frame
393 * @param downsamplingMode The downsampling mode to use when creating the individual pyramid layers, must be valid
394 * @param layers Number of pyramid layers to be created, with range [1, infinity)
395 * @param framePaddingElements The number of padding elements at the end of each frame row, in elements, with range [0, infinity)
396 * @param copyFirstLayer True, to copy the memory of the first layer into the pyramid; False, to re-use the memory of the first layer only (in this case, ensure that the memory of the first layer exists as long as this pyramid exist)
397 * @param worker Optional worker object to distribute the computation
398 * @param pixelFormat The explicit pixel format which will be used for each pyramid layer, must be compatible with DT_UNSIGNED_INTEGER_8 and 'channels'; FORMAT_UNDEFINED to use a generic pixel format
399 * @param timestamp Timestamp to be assigned to the frame pyramid (e.g., the timestamp of the frame used to created the timestamp)
400 * @return True, if the frame pyramid was replaced
401 * @see replace().
402 */
403 bool replace8BitPerChannel(const uint8_t* frame, const unsigned int width, const unsigned int height, const unsigned int channels, const FrameType::PixelOrigin pixelOrigin, const DownsamplingMode downsamplingMode, const unsigned int layers, const unsigned int framePaddingElements, const bool copyFirstLayer, Worker* worker, const FrameType::PixelFormat pixelFormat = FrameType::FORMAT_UNDEFINED, const Timestamp timestamp = Timestamp(false));
404
405 /**
406 * Replaces this frame pyramid by a new frame with 1 plane and data type DT_UNSIGNED_INTEGER_8 applying a 1-1 downsampling.
407 * This function is intentionally restrictive to reduce binary impact when used, use other function or the constructor in case more flexibility is needed an binary size does not matter.<br>
408 * The function will re-used the existing pyramid's memory of possible.
409 * @param frame The frame for which the pyramid will be created, must be valid
410 * @param width The width of the given frame in pixel, with range [1, infinity)
411 * @param height The height of the given frame in pixel, with range [1, infinity)
412 * @param channels The number of channels the given frame has, with range [1, infinity)
413 * @param pixelOrigin The pixel origin of the given frame
414 * @param layers The number of pyramid layers to be created, with range [1, infinity)
415 * @param framePaddingElements The number of padding elements at the end of each frame row, in elements, with range [0, infinity)
416 * @param copyFirstLayer True, to copy the memory of the first layer into the pyramid; False, to re-use the memory of the first layer only (in this case, ensure that the memory of the first layer exists as long as this pyramid exist)
417 * @param worker Optional worker object to distribute the computation
418 * @param pixelFormat The explicit pixel format which will be used for each pyramid layer, must be compatible with DT_UNSIGNED_INTEGER_8 and 'channels'; FORMAT_UNDEFINED to use a generic pixel format
419 * @param timestamp Timestamp to be assigned to the frame pyramid (e.g., the timestamp of the frame used to created the timestamp)
420 * @return True, if the frame pyramid was replaced
421 * @see isOwner(), replace().
422 */
423 bool replace8BitPerChannel11(const uint8_t* frame, const unsigned int width, const unsigned int height, const unsigned int channels, const FrameType::PixelOrigin pixelOrigin, const unsigned int layers, const unsigned int framePaddingElements, const bool copyFirstLayer, Worker* worker, const FrameType::PixelFormat pixelFormat = FrameType::FORMAT_UNDEFINED, const Timestamp timestamp = Timestamp(false));
424
425 /**
426 * Replaces this frame pyramid by a new frame with 1 plane and data type DT_UNSIGNED_INTEGER_8 applying a 1-1 downsampling.
427 * This function is intentionally restrictive to reduce binary impact when used, use other function or the constructor in case more flexibility is needed an binary size does not matter.<br>
428 * The function will re-used the existing pyramid's memory of possible.<br>
429 * This function does not provide the optimal image quality for images with alpha channel, use replace() instead.
430 * @param frame The frame for which the pyramid will be created, with 1 plane and data type DT_UNSIGNED_INTEGER_8, should not contain an alpha channel, must be valid
431 * @param layers The number of pyramid layers to be created, with range [1, infinity)
432 * @param copyFirstLayer True, to copy the memory of the first layer into the pyramid; False, to re-use the memory of the first layer only (in this case, ensure that the memory of the first layer exists as long as this pyramid exist)
433 * @param worker Optional worker object to distribute the computation
434 * @return True, if the frame pyramid was replaced
435 * @see isOwner(), replace().
436 */
437 inline bool replace8BitPerChannel11(const Frame& frame, const unsigned int layers, const bool copyFirstLayer, Worker* worker);
438
439 /**
440 * Replaces this frame pyramid with a new pyramid defined by the frame type of the finest layer.
441 * The image content of the replaced frame pyramid will be uninitialized.
442 * @param frameType The type of the finest pyramid layer, must be valid
443 * @param layers The number of layers to be created during the resizing, the resulting layers will be as many as possible but not exceed this value, with range [1, infinity)
444 * @param forceOwner True, to force the pyramid to be the owner of the memory afterwards; False, to allow that the pyramid is not owning the memory (because the memory is managed outside of this pyramid)
445 * @return True, if succeeded
446 */
447 inline bool replace(const FrameType& frameType, const bool forceOwner, const unsigned int layers);
448
449 /**
450 * Reduces the number of pyramid layers.
451 * @param layers The number of pyramid layers, with range [0, layers()]
452 */
453 void reduceLayers(const size_t layers);
454
455 /**
456 * Releases the internal frame layers.
457 */
458 inline void clear();
459
460 /**
461 * Returns whether the frame pyramid is the owner of the entire image data or owner of a specific pyramid layer.
462 * @param layerIndex The index of the layer to be checked, 'AS_MANY_LAYERS_AS_POSSIBLE" to check all layers
463 * @return True, if so
464 */
465 bool isOwner(const unsigned int layerIndex = AS_MANY_LAYERS_AS_POSSIBLE) const;
466
467 /**
468 * Returns whether this pyramid holds at least one frame layer.
469 * @return True, if so
470 */
471 inline bool isValid() const;
472
473 /**
474 * Returns the pyramid's memory block.
475 * This functions is intended for testing purposes only, don't use this function.
476 * @return The pyramid's memory block, if any
477 */
478 inline const Memory& memory() const;
479
480 /**
481 * Move operator
482 * @param right The right frame to assign
483 * @return Reference to this frame
484 */
486
487 /**
488 * Returns the frame of a specified layer.
489 * Beware: The frame will not be the owner of the frame data, if you need a copy of this frame enforce to copy the frame buffer!
490 * @param layer Index of the layer frame to be returned, with range [0, layers())
491 * @return Pyramid layer frame
492 */
493 inline const Frame& operator[](const unsigned int layer) const;
494
495 /**
496 * Returns the frame of a specified layer.
497 * Beware: The frame will not be the owner of the frame data, if you need a copy of this frame enforce to copy the frame buffer!
498 * @param layer Index of the layer frame to be returned, with range [0, layers())
499 * @return Pyramid layer frame
500 */
501 inline Frame& operator[](const unsigned int layer);
502
503 /**
504 * Returns whether this pyramid holds at least one frame layer.
505 * @return True, if so
506 */
507 explicit inline operator bool() const;
508
509 /**
510 * Returns the size factor of a specified layer in relation to the finest layer.
511 * The finest (first) layer has factor 1, the second layer has factor 2, the third layer has factor 4, ...<br>
512 * @param layer The layer to return the size factor for, with range [1, 31]
513 * @return The resulting size factor, with range [1, infinity)
514 */
515 static constexpr unsigned int sizeFactor(const unsigned int layer);
516
517 /**
518 * Determines the number of layers until an invalid frame size would be reached in the next layer.
519 * @param width The width of the finest layer in pixel, with range [1, infinity)
520 * @param height The height of the finest layer in pixel, with range [1, infinity)
521 * @param invalidCoarsestWidthOrHeight The width or the height of a coarse layer not valid any more, with range (0, infinity)
522 * @param coarsestLayerWidth Optional resulting width of the coarsest valid pyramid layer, with range [invalidCoarsestWidth + 1u, width], nullptr if not of interest
523 * @param coarsestLayerHeight Optional resulting height of the coarsest valid pyramid layer, with range [invalidCoarsestHeight + 1u, height], nullptr if not of interest
524 * @return Resulting layers so that the invalid frame size will not be reached, with range [1, infinity), 0 if 'width' or 'height' are smaller or equal than 'invalidCoarsestWidthOrHeight'
525 */
526 static unsigned int idealLayers(const unsigned int width, const unsigned int height, const unsigned int invalidCoarsestWidthOrHeight, unsigned int* coarsestLayerWidth = nullptr, unsigned int* coarsestLayerHeight = nullptr);
527
528 /**
529 * Determines the number of layers until an invalid frame size would be reached in the next layer.
530 * @param width The width of the finest layer in pixel, with range [1, infinity)
531 * @param height The height of the finest layer in pixel, with range [1, infinity)
532 * @param invalidCoarsestWidth The width of a coarse layer not valid any more, with range (0, infinity)
533 * @param invalidCoarsestHeight The height of a coarse layer not valid any more, with range (0, infinity)
534 * @param coarsestLayerWidth Optional resulting width of the coarsest valid pyramid layer, with range [invalidCoarsestWidth + 1u, width], nullptr if not of interest
535 * @param coarsestLayerHeight Optional resulting height of the coarsest valid pyramid layer, with range [invalidCoarsestHeight + 1u, height], nullptr if not of interest
536 * @return Resulting layers so that the invalid frame size will not be reached, with range [1, infinity), 0 if 'width/height' is smaller or equal than 'invalidCoarsestWidth/invalidCoarsestHeight'
537 */
538 static unsigned int idealLayers(const unsigned int width, const unsigned int height, const unsigned int invalidCoarsestWidth, const unsigned int invalidCoarsestHeight, unsigned int* coarsestLayerWidth = nullptr, unsigned int* coarsestLayerHeight = nullptr);
539
540 /**
541 * Determines the number of layers until an invalid frame size would be reached in the next layer or an overall size radius is reached.
542 * @param width The width of the finest layer in pixel
543 * @param height The height of the finest layer in pixel
544 * @param invalidCoarsestWidth Width of a coarse layer not valid any more, with range (0, infinity)
545 * @param invalidCoarsestHeight Height of a coarse layer not valid any more, with range (0, infinity)
546 * @param layerFactor Size factor on each layer (a factor of 2 means that the layer dimension is halved on each layer), with range [2, infinity)
547 * @param maximalRadius Maximal radius that can be reached on the finest layer by starting with coarsestLayerRadius on the coarsest layer in pixel (the maximal expected baseline between two pixels in the finest pyramid layer), with range [1, infinity)
548 * @param coarsestLayerRadius The search radius on the coarsest layer, with range [2, infinity)
549 * @param coarsestLayerWidth Optional resulting width of the coarsest valid pyramid layer, with range [invalidCoarsestWidth + 1u, width], nullptr if not of interest
550 * @param coarsestLayerHeight Optional resulting height of the coarsest valid pyramid layer, with range [invalidCoarsestHeight + 1u, height], nullptr if not of interest
551 * @return Resulting layers so that the invalid frame size will not be reached, with range [1, infinity), 0 if 'width/height' is smaller or equal than 'invalidCoarsestWidth/invalidCoarsestHeight'
552 */
553 static unsigned int idealLayers(const unsigned int width, const unsigned int height, const unsigned int invalidCoarsestWidth, const unsigned int invalidCoarsestHeight, const unsigned int layerFactor, const unsigned int maximalRadius = (unsigned int)(-1), const unsigned int coarsestLayerRadius = 2u, unsigned int* coarsestLayerWidth = nullptr, unsigned int* coarsestLayerHeight = nullptr);
554
555 protected:
556
557 /**
558 * Disabled constructor.
559 */
560 explicit FramePyramid(Frame&&) = delete;
561
562 /**
563 * Disabled constructor.
564 */
565 FramePyramid(const Frame&, const bool) = delete;
566
567 /**
568 * Disabled constructor to prevent confusion between all constructors.
569 */
570 FramePyramid(const Frame& frame, const DownsamplingMode downsamplingMode, const unsigned int layers, Worker* worker) = delete;
571
572 /**
573 * Disabled constructor to prevent confusion between all constructors.
574 */
575 FramePyramid(const Frame& frame, const DownsamplingFunction& downsamplingFunction, const unsigned int layers, Worker* worker) = delete;
576
577 /**
578 * Replaces this frame pyramid with a new pyramid defined by the frame type of the finest layer.
579 * The image content of the replaced frame pyramid will be uninitialized.
580 * @param frameType The type of the finest pyramid layer, must be valid
581 * @param reserveFirstLayerMemory True, to reserve memory for the first pyramid layer (and to initialize the first layer frame); False, to reserve memory for the remaining pyramid layers only (and to skip initializing the first layer frame)
582 * @param layers The number of layers to be created during the resizing, the resulting layers will be as many as possible but not exceed this value, with range [1, infinity)
583 * @param forceOwner True, to force the pyramid to be the owner of the memory afterwards; False, to allow that the pyramid is not owning the memory (because the memory is managed outside of this pyramid)
584 * @return True, if succeeded
585 */
586 bool replace(const FrameType& frameType, const bool reserveFirstLayerMemory, const bool forceOwner, const unsigned int layers);
587
588 /**
589 * Calculates the size of the entire pyramid in bytes covering all images in all pyramid layers.
590 * @param width The width of the finest layer in pixel, with range [0, 65535]
591 * @param height The height of the finest layer in pixel, with range [0, 65535]
592 * @param pixelFormat The pixel format of each layer, must be a generic 1-plane pixel format, must be valid
593 * @param layers Number of layers, with range [0, infinity)
594 * @param includeFirstLayer True, to determine the memory for all layers; False, to skip the first layer and only determine the memory for all remaining (coarser) layers
595 * @param totalLayers Optional resulting number of pyramid layers that will exist (always counts the very first layer independently of 'includeFirstLayer'), with range [0, layers]
596 * @return Resulting number of bytes, with range [0, infinity)
597 */
598 static size_t calculateMemorySize(const unsigned int width, const unsigned int height, const FrameType::PixelFormat pixelFormat, const unsigned int layers, const bool includeFirstLayer, unsigned int* totalLayers = nullptr);
599
600 /**
601 * Deleted function to prevent confusion between Frame and FrameType.
602 * @param frame The potential frame to be used
603 * @param layers The number of layers
604 * @param forceOwner The ownership information
605 * @return True, if succeeded
606 */
607 bool replace(const Frame& frame, const bool forceOwner, const unsigned int layers = AS_MANY_LAYERS_AS_POSSIBLE) = delete;
608
609 /**
610 * Disabled assign operator
611 * Use a constructor or the move operator instead.
612 * @return Reference to this object
613 */
615
616 /**
617 * Downsamples a frame with 1-1 filter.
618 * @param finerLayer The finer pyramid layer, must be valid
619 * @param coarserLayer The coarser pyramid layer, must be valid
620 * @param worker The optional worker to distribute the computation
621 * @return True, if succeeded
622 */
623 static bool downsampleByTwo11(const Frame& finerLayer, Frame& coarserLayer, Worker* worker);
624
625 /**
626 * Downsamples a frame with 1-1 filter which contains an alpha channel.
627 * @param finerLayer The finer pyramid layer, must be valid
628 * @param coarserLayer The coarser pyramid layer, must be valid
629 * @param worker The optional worker to distribute the computation
630 * @return True, if succeeded
631 */
632 static bool downsampleAlphaByTwo11(const Frame& finerLayer, Frame& coarserLayer, Worker* worker);
633
634 /**
635 * Downsamples a frame with 1-4-6-4-1 filter.
636 * @param finerLayer The finer pyramid layer, must be valid
637 * @param coarserLayer The coarser pyramid layer, must be valid
638 * @param worker The optional worker to distribute the computation
639 * @return True, if succeeded
640 */
641 static bool downsampleByTwo14641(const Frame& finerLayer, Frame& coarserLayer, Worker* worker);
642
643 /**
644 * Returns the downsampling function for a specified downsampling mode.
645 * @param downsamplingMode The downsampling mode for which the function will be returned
646 * @param pixelFormat The pixel format for which the downsampling function will be returned, must be valid
647 * @return The downsampling function, nullptr if unknown
648 */
650
651 /**
652 * Deleted function to prevent confusion between several different replace functions.
653 */
654 bool replace(const Frame&, const DownsamplingMode, const unsigned int layers, Worker* worker) = delete;
655
656 /**
657 * Deleted function to prevent confusion between several different replace functions.
658 */
659 bool replace(const Frame&, const DownsamplingFunction&, const unsigned int layers, Worker* worker) = delete;
660
661 protected:
662
663 /// The individual layers of this pyramid, zero if not valid.
665
666 /// Optional memory which may be used by at least one pyramid layer.
668};
669
671{
672 // nothing to do here
673}
674
675inline FramePyramid::FramePyramid(const uint8_t* frame, const unsigned int width, const unsigned int height, const unsigned int channels, const FrameType::PixelOrigin pixelOrigin, const unsigned int layers, const unsigned int framePaddingElements, const bool copyFirstLayer, Worker* worker, const FrameType::PixelFormat pixelFormat, const Timestamp timestamp)
676{
677 ocean_assert(frame != nullptr && width >= 1u && height >= 1u && layers >= 1u);
678 ocean_assert(channels >= 1u);
679
680 const bool result = replace8BitPerChannel11(frame, width, height, channels, pixelOrigin, layers, framePaddingElements, copyFirstLayer, worker, pixelFormat, timestamp);
681 ocean_assert_and_suppress_unused(result, result);
682}
683
684inline FramePyramid::FramePyramid(const Frame& frame, const unsigned int layers, const bool copyFirstLayer, Worker* worker)
685{
686 const bool result = replace8BitPerChannel11(frame, layers, copyFirstLayer, worker);
687 ocean_assert_and_suppress_unused(result, result);
688}
689
690inline FramePyramid::FramePyramid(const uint8_t* frame, const unsigned int width, const unsigned int height, const unsigned int channels, const FrameType::PixelOrigin pixelOrigin, const DownsamplingMode downsamplingMode, const unsigned int layers, const unsigned int framePaddingElements, const bool copyFirstLayer, Worker* worker, const FrameType::PixelFormat pixelFormat, const Timestamp timestamp)
691{
692 ocean_assert(frame != nullptr && width >= 1u && height >= 1u && layers >= 1u);
693 ocean_assert(channels >= 1u);
694
695 const bool result = replace8BitPerChannel(frame, width, height, channels, pixelOrigin, downsamplingMode, layers, framePaddingElements, copyFirstLayer, worker, pixelFormat, timestamp);
696 ocean_assert_and_suppress_unused(result, result);
697}
698
699inline FramePyramid::FramePyramid(const Frame& frame, const DownsamplingMode downsamplingMode, const unsigned int layers, const bool copyFirstLayer, Worker* worker)
700{
701 const bool result = replace(frame, downsamplingMode, layers, copyFirstLayer, worker);
702 ocean_assert_and_suppress_unused(result, result);
703}
704
705inline FramePyramid::FramePyramid(const Frame& frame, const DownsamplingFunction& downsamplingFunction, const unsigned int layers, const bool copyFirstLayer, Worker* worker)
706{
707 const bool result = replace(frame, downsamplingFunction, layers, copyFirstLayer, worker);
708 ocean_assert_and_suppress_unused(result, result);
709}
710
711inline FramePyramid::FramePyramid(const DownsamplingMode downsamplingMode, Frame&& frame, const unsigned int layers, Worker* worker)
712{
713 const bool result = replace(downsamplingMode, std::move(frame), layers, worker);
714 ocean_assert_and_suppress_unused(result, result);
715}
716
717inline FramePyramid::FramePyramid(const DownsamplingFunction& downsamplingFunction, Frame&& frame, const unsigned int layers, Worker* worker)
718{
719 const bool result = replace(downsamplingFunction, std::move(frame), layers, worker);
720 ocean_assert_and_suppress_unused(result, result);
721}
722
723inline const Frame& FramePyramid::layer(const unsigned int layer) const
724{
725 ocean_assert(layer < layers_.size());
726 return layers_[layer];
727}
728
729inline Frame& FramePyramid::layer(const unsigned int layer)
730{
731 ocean_assert(layer < layers_.size());
732 return layers_[layer];
733}
734
735inline const Frame& FramePyramid::finestLayer() const
736{
737 ocean_assert(isValid());
738 return layers_.front();
739}
740
742{
743 ocean_assert(isValid());
744 return layers_.front();
745}
746
748{
749 ocean_assert(isValid());
750
751 return layers_.back();
752}
753
755{
756 ocean_assert(isValid());
757
758 return layers_.back();
759}
760
761inline unsigned int FramePyramid::layers() const
762{
763 return (unsigned int)layers_.size();
764}
765
766inline unsigned int FramePyramid::width(const unsigned int layer) const
767{
768 ocean_assert(layer < layers_.size());
769 return layers_[layer].width();
770}
771
772inline unsigned int FramePyramid::height(const unsigned int layer) const
773{
774 ocean_assert(layer < layers_.size());
775 return layers_[layer].height();
776}
777
778inline unsigned int FramePyramid::finestWidth() const
779{
780 ocean_assert(isValid());
781 return layers_.front().width();
782}
783
784inline unsigned int FramePyramid::finestHeight() const
785{
786 ocean_assert(isValid());
787 return layers_.front().height();
788}
789
790inline unsigned int FramePyramid::coarsestWidth() const
791{
792 ocean_assert(isValid());
793
794 return layers_.back().width();
795}
796
797inline unsigned int FramePyramid::coarsestHeight() const
798{
799 ocean_assert(isValid());
800
801 return layers_.back().height();
802}
803
805{
806 ocean_assert(isValid());
807
808 return 1u << (unsigned int)((layers_.size() - 1));
809}
810
812{
813 ocean_assert(isValid());
814 return layers_.front().frameType();
815}
816
817inline bool FramePyramid::replace8BitPerChannel11(const Frame& frame, const unsigned int layers, const bool copyFirstLayer, Worker* worker)
818{
819 ocean_assert(frame.isValid() && frame.numberPlanes() == 1u && frame.dataType() == FrameType::DT_UNSIGNED_INTEGER_8);
820
821 if (frame.numberPlanes() == 1u && frame.dataType() == FrameType::DT_UNSIGNED_INTEGER_8)
822 {
823 return replace8BitPerChannel11(frame.constdata<uint8_t>(), frame.width(), frame.height(), frame.channels(), frame.pixelOrigin(), layers, frame.paddingElements(), copyFirstLayer, worker, frame.pixelFormat(), frame.timestamp());
824 }
825
826 return false;
827}
828
829inline bool FramePyramid::replace(const FrameType& frameType, const bool forceOwner, const unsigned int layers)
830{
831 return replace(frameType, true /*reserveFirstLayerMemory*/, forceOwner, layers);
832}
833
834constexpr unsigned int FramePyramid::sizeFactor(const unsigned int layer)
835{
836 ocean_assert(layer <= 31u);
837 if (layer > 31u)
838 {
839 return 0u;
840 }
841
842 return 1u << layer;
843}
844
846{
847 layers_.clear();
848 memory_.free();
849}
850
851inline const Frame& FramePyramid::operator[](const unsigned int layer) const
852{
853 ocean_assert(layer < layers_.size());
854 return layers_[layer];
855}
856
857inline Frame& FramePyramid::operator[](const unsigned int layer)
858{
859 ocean_assert(layer < layers_.size());
860 return layers_[layer];
861}
862
863inline bool FramePyramid::isValid() const
864{
865 return !layers_.empty();
866}
867
868inline const Memory& FramePyramid::memory() const
869{
870 return memory_;
871}
872
873inline FramePyramid::operator bool() const
874{
875 return isValid();
876}
877
878}
879
880}
881
882#endif // META_OCEAN_CV_FRAME_PYRAMID_H
This class implements a frame pyramid.
Definition FramePyramid.h:37
static CV::FramePyramid::DownsamplingFunction downsamplingFunction(const CV::FramePyramid::DownsamplingMode downsamplingMode, const FrameType::PixelFormat pixelFormat)
Returns the downsampling function for a specified downsampling mode.
const Frame & finestLayer() const
Returns the finest layer frame of this pyramid.
Definition FramePyramid.h:735
FramePyramid(const FramePyramid &framePyramid, const unsigned int firstLayerIndex, const unsigned int layers, bool copyData)
Creates a new frame pyramid based on an existing frame pyramid.
FramePyramid(const unsigned int layers, const FrameType &frameType)
Creates a frame pyramid object for a given frame type and layer number.
bool replace(const Frame &frame, const DownsamplingMode downsamplingMode, const unsigned int layers, const bool copyFirstLayer, Worker *worker)
Replaces this frame pyramid based on a new frame.
static unsigned int idealLayers(const unsigned int width, const unsigned int height, const unsigned int invalidCoarsestWidthOrHeight, unsigned int *coarsestLayerWidth=nullptr, unsigned int *coarsestLayerHeight=nullptr)
Determines the number of layers until an invalid frame size would be reached in the next layer.
unsigned int coarsestWidth() const
Returns the width of the coarsest (last) layer regarding to the number of valid layers.
Definition FramePyramid.h:790
FramePyramid(Frame &&)=delete
Disabled constructor.
bool replace8BitPerChannel(const uint8_t *frame, const unsigned int width, const unsigned int height, const unsigned int channels, const FrameType::PixelOrigin pixelOrigin, const DownsamplingMode downsamplingMode, const unsigned int layers, const unsigned int framePaddingElements, const bool copyFirstLayer, Worker *worker, const FrameType::PixelFormat pixelFormat=FrameType::FORMAT_UNDEFINED, const Timestamp timestamp=Timestamp(false))
Replaces this frame pyramid based on a new frame.
unsigned int finestWidth() const
Returns the width of the finest (first) layer.
Definition FramePyramid.h:778
bool replace(const Frame &frame, const DownsamplingFunction &downsamplingFunction, const unsigned int layers, const bool copyFirstLayer, Worker *worker)
Replaces this frame pyramid based on a new frame.
void reduceLayers(const size_t layers)
Reduces the number of pyramid layers.
bool replace(const DownsamplingMode downsamplingMode, Frame &&frame, const unsigned int layers, Worker *worker)
Replaces this frame pyramid based on a new frame.
bool replace(const Frame &, const DownsamplingMode, const unsigned int layers, Worker *worker)=delete
Deleted function to prevent confusion between several different replace functions.
const Memory & memory() const
Returns the pyramid's memory block.
Definition FramePyramid.h:868
bool replace(const FrameType &frameType, const bool reserveFirstLayerMemory, const bool forceOwner, const unsigned int layers)
Replaces this frame pyramid with a new pyramid defined by the frame type of the finest layer.
bool isValid() const
Returns whether this pyramid holds at least one frame layer.
Definition FramePyramid.h:863
std::function< bool(const Frame &sourceLayer, Frame &targetLayer, Worker *worker)> DownsamplingFunction
Definition of a function allowing to downsample a frame.
Definition FramePyramid.h:82
static unsigned int idealLayers(const unsigned int width, const unsigned int height, const unsigned int invalidCoarsestWidth, const unsigned int invalidCoarsestHeight, const unsigned int layerFactor, const unsigned int maximalRadius=(unsigned int)(-1), const unsigned int coarsestLayerRadius=2u, unsigned int *coarsestLayerWidth=nullptr, unsigned int *coarsestLayerHeight=nullptr)
Determines the number of layers until an invalid frame size would be reached in the next layer or an ...
FramePyramid & operator=(const FramePyramid &)=delete
Disabled assign operator Use a constructor or the move operator instead.
Frames layers_
The individual layers of this pyramid, zero if not valid.
Definition FramePyramid.h:664
unsigned int coarsestHeight() const
Returns the height of the coarsest (last) layer regarding to the number of valid layers.
Definition FramePyramid.h:797
unsigned int width(const unsigned int layer) const
Returns the width of a given layer.
Definition FramePyramid.h:766
static unsigned int idealLayers(const unsigned int width, const unsigned int height, const unsigned int invalidCoarsestWidth, const unsigned int invalidCoarsestHeight, unsigned int *coarsestLayerWidth=nullptr, unsigned int *coarsestLayerHeight=nullptr)
Determines the number of layers until an invalid frame size would be reached in the next layer.
FramePyramid & operator=(FramePyramid &&right) noexcept
Move operator.
DownsamplingMode
Definition of individual down sampling modes.
Definition FramePyramid.h:44
@ DM_FILTER_11
Down sampling is realized by a 2x2 averaging filter.
Definition FramePyramid.h:56
FramePyramid(const Frame &frame, const DownsamplingFunction &downsamplingFunction, const unsigned int layers, Worker *worker)=delete
Disabled constructor to prevent confusion between all constructors.
FramePyramid(const FramePyramid &framePyramid, const bool copyData)
Copy constructor.
const Frame & operator[](const unsigned int layer) const
Returns the frame of a specified layer.
Definition FramePyramid.h:851
void clear()
Releases the internal frame layers.
Definition FramePyramid.h:845
unsigned int coarsestSizeFactor() const
Returns the size factor for the coarsest layer in relation to the finest layer regarding to the numbe...
Definition FramePyramid.h:804
FramePyramid()
Creates an empty frame pyramid object.
Definition FramePyramid.h:670
const Frame & coarsestLayer() const
Returns the coarsest layer frame of this pyramid regarding to the number of valid layers.
Definition FramePyramid.h:747
static size_t calculateMemorySize(const unsigned int width, const unsigned int height, const FrameType::PixelFormat pixelFormat, const unsigned int layers, const bool includeFirstLayer, unsigned int *totalLayers=nullptr)
Calculates the size of the entire pyramid in bytes covering all images in all pyramid layers.
unsigned int layers() const
Returns the number of layers this pyramid holds.
Definition FramePyramid.h:761
static bool downsampleByTwo11(const Frame &finerLayer, Frame &coarserLayer, Worker *worker)
Downsamples a frame with 1-1 filter.
FramePyramid(const Frame &, const bool)=delete
Disabled constructor.
bool replace(const Frame &frame, const bool forceOwner, const unsigned int layers=AS_MANY_LAYERS_AS_POSSIBLE)=delete
Deleted function to prevent confusion between Frame and FrameType.
static bool downsampleAlphaByTwo11(const Frame &finerLayer, Frame &coarserLayer, Worker *worker)
Downsamples a frame with 1-1 filter which contains an alpha channel.
bool replace(const Frame &, const DownsamplingFunction &, const unsigned int layers, Worker *worker)=delete
Deleted function to prevent confusion between several different replace functions.
Memory memory_
Optional memory which may be used by at least one pyramid layer.
Definition FramePyramid.h:667
FramePyramid(const Frame &frame, const DownsamplingMode downsamplingMode, const unsigned int layers, Worker *worker)=delete
Disabled constructor to prevent confusion between all constructors.
bool replace8BitPerChannel11(const uint8_t *frame, const unsigned int width, const unsigned int height, const unsigned int channels, const FrameType::PixelOrigin pixelOrigin, const unsigned int layers, const unsigned int framePaddingElements, const bool copyFirstLayer, Worker *worker, const FrameType::PixelFormat pixelFormat=FrameType::FORMAT_UNDEFINED, const Timestamp timestamp=Timestamp(false))
Replaces this frame pyramid by a new frame with 1 plane and data type DT_UNSIGNED_INTEGER_8 applying ...
const FrameType & frameType() const
Returns the frame type of the finest layer.
Definition FramePyramid.h:811
unsigned int finestHeight() const
Returns the height of the finest (first) layer.
Definition FramePyramid.h:784
unsigned int height(const unsigned int layer) const
Returns the height of a given layer.
Definition FramePyramid.h:772
bool isOwner(const unsigned int layerIndex=AS_MANY_LAYERS_AS_POSSIBLE) const
Returns whether the frame pyramid is the owner of the entire image data or owner of a specific pyrami...
static constexpr unsigned int sizeFactor(const unsigned int layer)
Returns the size factor of a specified layer in relation to the finest layer.
Definition FramePyramid.h:834
FramePyramid(FramePyramid &&framePyramid) noexcept
Move constructor.
static bool downsampleByTwo14641(const Frame &finerLayer, Frame &coarserLayer, Worker *worker)
Downsamples a frame with 1-4-6-4-1 filter.
const Frame & layer(const unsigned int layer) const
Returns the frame of a specified layer.
Definition FramePyramid.h:723
bool replace(const DownsamplingFunction &downsamplingFunction, Frame &&frame, const unsigned int layers, Worker *worker)
Replaces this frame pyramid based on a new frame.
This class implements Ocean's image class.
Definition Frame.h:1808
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:4248
bool isValid() const
Returns whether this frame is valid.
Definition Frame.h:4528
const Timestamp & timestamp() const
Returns the timestamp of this frame.
Definition Frame.h:4218
unsigned int size(const unsigned int planeIndex=0u) const
Returns the number of bytes necessary for a specific plane including optional padding at the end of p...
Definition Frame.h:4114
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:4122
Definition of a frame type composed by the frame dimension, pixel format and pixel origin.
Definition Frame.h:30
PixelFormat
Definition of all pixel formats available in the Ocean framework.
Definition Frame.h:183
unsigned int width() const
Returns the width of the frame format in pixel.
Definition Frame.h:3170
PixelOrigin pixelOrigin() const
Returns the pixel origin of the frame.
Definition Frame.h:3215
uint32_t numberPlanes() const
Returns the number of planes of the pixel format of this frame.
Definition Frame.h:3210
PixelFormat pixelFormat() const
Returns the pixel format of the frame.
Definition Frame.h:3180
PixelOrigin
Defines different types of frame origin positions.
Definition Frame.h:1046
@ DT_UNSIGNED_INTEGER_8
Unsigned 8 bit integer data type (uint8_t).
Definition Frame.h:41
unsigned int height() const
Returns the height of the frame in pixel.
Definition Frame.h:3175
unsigned int channels() const
Returns the number of individual channels the frame has.
Definition Frame.h:3200
DataType dataType() const
Returns the data type of the pixel format of this frame.
Definition Frame.h:3190
This class implements an object able to allocate memory.
Definition base/Memory.h:22
void free()
Explicitly frees (releases) the memory before this object is released.
Definition base/Memory.h:370
This class implements a timestamp.
Definition Timestamp.h:36
This class implements a worker able to distribute function calls over different threads.
Definition Worker.h:33
std::vector< Frame > Frames
Definition of a vector holding padding frames.
Definition Frame.h:1771
The namespace covering the entire Ocean framework.
Definition Accessor.h:15