Ocean
Loading...
Searching...
No Matches
FrameMean.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_MEAN_H
9#define META_OCEAN_CV_FRAME_MEAN_H
10
11#include "ocean/cv/CV.h"
15
16#include "ocean/base/Frame.h"
17#include "ocean/base/Worker.h"
18
19namespace Ocean
20{
21
22namespace CV
23{
24
25/**
26 * This class implements functions allowing to determine e.g., the mean pixel value of a frame of a mean frame based on several frames.
27 * @ingroup cv
28 */
29class OCEAN_CV_EXPORT FrameMean
30{
31 public:
32
33 /**
34 * Determines the mean pixel value for a given frame.
35 * @param frame The data of the frame for which the mean value will be determined, must be valid
36 * @param width The width of the given frame in pixel, with range [1, infinity)
37 * @param height The height of the given frame in pixel, with range [1, infinity)
38 * @param meanValues The resulting mean values, one for each channel
39 * @param framePaddingElements The number of padding elements at the end of each frame row, in elements, with range [0, infinity)
40 * @param worker An optional worker object to distribute the computation
41 * @tparam T The data type of each pixel channel
42 * @tparam TMean The data type of each mean value
43 * @tparam tChannels The number of frame channels, with range [1, infinity)
44 */
45 template <typename T, typename TMean, unsigned int tChannels>
46 static void meanValue(const T* frame, const unsigned int width, const unsigned int height, TMean* meanValues, const unsigned int framePaddingElements, Worker* worker = nullptr);
47
48 /**
49 * Determines the mean frame for a given set of frames.
50 * The resulting mean frame is determined by adding the pixel color values of all frames individually with a subsequent normalization (by the number of frames).<br>
51 * Beware: This function cannot handle more than 16843010 frames.<br>
52 * @param frameProviderInterface The frame provider interface providing the set of frames, must be initialized
53 * @param targetPixelFormat The pixel format of the resulting mean frame, every frame from the frame provider will be converted into this pixel format before any application
54 * @param firstFrameIndex The index of the first frame from the frame provider interface which is used to determine the mean frame
55 * @param lastFrameIndex The index of the last (including) frame from the frame provider interface, with range [first, number frames from the interface)
56 * @param worker An optional worker object to distribute the computation
57 * @param abort An optional abort statement allowing to abort the determination at any time; set the value True to abort the request
58 * @return The resulting mean frame
59 * @see meanFrame8BitPerChannel().
60 */
61 static Frame meanFrame(FrameProviderInterface& frameProviderInterface, const FrameType::PixelFormat& targetPixelFormat, const unsigned int firstFrameIndex, const unsigned int lastFrameIndex, Worker* worker = nullptr, bool* abort = nullptr);
62
63 /**
64 * Determines the mean frame for a given set of frames.
65 * The resulting mean frame is determined by adding the pixel color values of all frames individually with a subsequent normalization (by the number of frames).<br>
66 * @param frameProviderInterface The frame provider interface providing the set of frames, must be initialized
67 * @param targetPixelFormat The pixel format of the resulting mean frame, every frame from the frame provider will be converted into this pixel format before any application
68 * @param firstFrameIndex The index of the first frame from the frame provider interface which is used to determine the mean frame
69 * @param lastFrameIndex The index of the last (including) frame from the frame provider interface, with range [first, number frames from the interface)
70 * @param worker An optional worker object to distribute the computation
71 * @param abort An optional abort statement allowing to abort the determination at any time; set the value True to abort the request
72 * @return The resulting mean frame
73 * @tparam tChannels The number of frame data channels which must correspond to the given targetPixelFormat
74 * @see meanFrame().
75 */
76 template <unsigned int tChannels>
77 static Frame meanFrame8BitPerChannel(FrameProviderInterface& frameProviderInterface, const FrameType::PixelFormat& targetPixelFormat, const unsigned int firstFrameIndex, const unsigned int lastFrameIndex, Worker* worker = nullptr, bool* abort = nullptr);
78
79 /**
80 * Adds the individual pixel values of a given source frame to a target frame.
81 * @param source The source frame which pixels values are copied
82 * @param target The target frame to which the source pixel values will be added, individually for each pixel and channel
83 * @param width The width of both frames in pixels, with range [1, infinity)
84 * @param height The height of both frames in pixels, with range [1, infinity)
85 * @param sourcePaddingElements The number of padding elements at the end of each source row, in elements, with range [0, infinity)
86 * @param targetPaddingElements The number of padding elements at the end of each target row, in elements, with range [0, infinity)
87 * @param worker An optional worker object to distribute the computation
88 * @tparam TSource The data type of the elements of the source frame
89 * @tparam TTarget The data type of the elements of the target frame
90 * @tparam tChannels The number of frame data channels, with range [1, infinity)
91 */
92 template <typename TSource, typename TTarget, unsigned int tChannels>
93 static inline void addToFrame(const TSource* const source, TTarget* const target, const unsigned int width, const unsigned int height, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, Worker* worker = nullptr);
94
95 /**
96 * Adds the individual pixel values of a given source frame to a target frame if the corresponding mask pixel is valid.
97 * @param source The source frame which pixels values are copied, must be valid and not have more than 4 channels and an 8 bit, unsigned data type
98 * @param mask The mask frame defining whether a source pixel is copied or not (and whether the corresponding normalization denominator of the target frame is increased by 1), must be valid and the data type must 8 bit, unsigned
99 * @param target The target frame to which the source pixel values will be added, must be valid and the frame type like source except that the data type must be 32 bit, unsigned
100 * @param denominators The denominator values individually for each pixel, must be valid and the data type must be 32 bit, unsigned
101 * @param worker An optional worker object to distribute the computation
102 * @param nonMaskValue The value indicating invalid mask pixels, i.e. pixels that should not be processed by this function, all other values will be interpreted as valid, range: [0, 255]
103 * @return True, if succeeded
104 */
105 static bool addToFrameIndividually(const Frame& source, const Frame& mask, Frame& target, Frame& denominators, const uint8_t nonMaskValue, Worker* worker = nullptr);
106
107 /**
108 * Adds the individual pixel values of a given source frame to a target frame if the corresponding mask pixel is valid.
109 * @param source The source frame which pixels values are copied
110 * @param mask The mask frame defining whether a source pixel is copied or not (and whether the corresponding normalization denominator of the target frame is increased by 1)
111 * @param target The target frame to which the source pixel values will be added
112 * @param denominators The denominator values individually for each pixel
113 * @param width The width of both frames in pixels, with range [1, infinity)
114 * @param height The height of both frames in pixels, with range [1, infinity)
115 * @param sourcePaddingElements The number of padding elements of the source frame, range: [0, infinity)
116 * @param maskPaddingElements The number of padding elements of the mask frame, range: [0, infinity)
117 * @param targetPaddingElements The number of padding elements of the target frame, range: [0, infinity)
118 * @param denominatorsPaddingElements The number of padding elements of the denominators frame, range: [0, infinity)
119 * @param nonMaskValue The value indicating invalid mask pixels, i.e. pixels that should not be processed by this function, all other values will be interpreted as valid, range: [0, 255]
120 * @param worker An optional worker object to distribute the computation
121 * @tparam tChannels The number of frame data channels, not including the extra channel for the denominator value
122 */
123 template <unsigned int tChannels>
124 static inline void addToFrameIndividually8BitPerChannel(const uint8_t* source, const uint8_t* mask, unsigned int* target, unsigned int* denominators, const unsigned int width, const unsigned int height, const unsigned int sourcePaddingElements, const unsigned int maskPaddingElements, const unsigned int targetPaddingElements, const unsigned int denominatorsPaddingElements, const uint8_t nonMaskValue, Worker* worker = nullptr);
125
126 /**
127 * Adds the individual pixel values of a given source frame to a target frame.
128 * @param source The source frame which pixels values are copied
129 * @param targetWithDenominator The target frame to which the source pixel values will be added, with individual denominator values, the denominator of each pixel is increased by 1
130 * @param width The width of both frames in pixels, with range [1, infinity)
131 * @param height The height of both frames in pixels, with range [1, infinity)
132 * @param worker An optional worker object to distribute the computation
133 * @tparam tChannels The number of frame data channels, not including the extra channel for the denominator value
134 */
135 template <unsigned int tChannels>
136 static inline void addToFrameIndividually8BitPerChannel(const uint8_t* source, unsigned int* targetWithDenominator, const unsigned int width, const unsigned int height, Worker* worker = nullptr);
137
138 /**
139 * Adds the individual pixel values of a given source frame to a target frame if the corresponding mask pixel is valid.
140 * @param source The source frame which pixels values are copied
141 * @param mask The mask frame defining whether a source pixel is copied or not (and whether the corresponding normalization denominator of the target frame is increased by 1)
142 * @param targetWithDenominator The target frame to which the source pixel values will be added, with individual denominator values
143 * @param width The width of both frames in pixels, with range [1, infinity)
144 * @param height The height of both frames in pixels, with range [1, infinity)
145 * @param worker An optional worker object to distribute the computation
146 * @tparam tChannels The number of frame data channels, not including the extra channel for the denominator value
147 */
148 template <unsigned int tChannels>
149 static inline void addToFrameIndividually8BitPerChannel(const uint8_t* source, const uint8_t* mask, unsigned int* targetWithDenominator, const unsigned int width, const unsigned int height, Worker* worker = nullptr);
150
151 /**
152 * Normalizes the pixels values of a given (accumulated frame) by a given denominator.
153 * @param source The accumulated source frame which has to be normalized, must be valid
154 * @param target The target frame which receives the normalized source frame, must be valid
155 * @param denominator The denominator which is used to normalize each frame pixel and channel of the source frame, with range [1, infinity)
156 * @param width The width of both frames in pixels, with range [1, infinity)
157 * @param height The height of both frames in pixels, with range [1, infinity)
158 * @param sourcePaddingElements The number of padding elements at the end of each source row, in elements, with range [0, infinity)
159 * @param targetPaddingElements The number of padding elements at the end of each target row, in elements, with range [0, infinity)
160 * @param worker An optional worker object to distribute the computation
161 * @tparam TSource The data type of the elements of the source frame
162 * @tparam TTarget The data type of the elements of the target frame
163 * @tparam tChannels The number of frame data channels, with range [1, infinity)
164 */
165 template <typename TSource, typename TTarget, unsigned int tChannels>
166 static inline void normalizeFrame(const TSource* const source, TTarget* const target, const TSource denominator, unsigned int width, const unsigned int height, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, Worker* worker = nullptr);
167
168 /**
169 * Normalizes the pixels values of a given (accumulated frame) by individual denominator values.
170 * The denominator values are provided as a second frame with corresponding pixel layout as the source frame.<br>
171 * @param source The accumulated source frame which has to be normalized
172 * @param denominators The normalization denominator frame individually for each pixel, with range [0, infinity)
173 * @param target The target frame which receives the normalized source frame
174 * @param width The width of both frames in pixels, with range [1, infinity)
175 * @param height The height of both frames in pixels, with range [1, infinity)
176 * @param zeroValue The target pixel value for pixels with denominator value equal to zero
177 * @param worker An optional worker object to distribute the computation
178 * @tparam tChannels The number of frame data channels
179 */
180 template <unsigned int tChannels>
181 static inline void normalizeFrameIndividually8BitPerChannel(const unsigned int* source, const unsigned int* denominators, uint8_t* target, const unsigned int width, const unsigned int height, const uint8_t* zeroValue = nullptr, Worker* worker = nullptr);
182
183 /**
184 * Normalizes the pixels values of a given (accumulated frame) by individual denominator values.
185 * @param sourceWithDenominator The accumulated source frame together with the individual denominator values
186 * @param target The target frame which receives the normalized source frame
187 * @param width The width of both frames in pixels, with range [1, infinity)
188 * @param height The height of both frames in pixels, with range [1, infinity)
189 * @param zeroValue The target pixel value for pixels with denominator value equal to zero
190 * @param worker An optional worker object to distribute the computation
191 * @tparam tChannels The number of frame data channels, not including the extra channel for the denominator value
192 */
193 template <unsigned int tChannels>
194 static inline void normalizeFrameIndividually8BitPerChannel(const unsigned int* sourceWithDenominator, uint8_t* target, const unsigned int width, const unsigned int height, const uint8_t* zeroValue, Worker* worker = nullptr);
195
196 protected:
197
198 /**
199 * Sums the pixel values in a subset of a given frame.
200 * @param frame The data of the frame for which the summed pixel values will be determined, must be valid
201 * @param width The width of the given frame in pixel, with range [1, infinity)
202 * @param sumValues The resulting summed pixel values values, one for each channel
203 * @param lock Lock object which must be provided if this function is invoked in parallel; nullptr otherwise
204 * @param framePaddingElements The number of padding elements at the end of each image row, in elements, with range [0, infinity)
205 * @param firstRow The first row to be handled, with range [0, 'frame height')
206 * @param numberRows The number of rows to be handled, with range [1, 'frame height' - firstRow]
207 * @tparam T The data type of each pixel channel
208 * @tparam TSum Data type of each sum value
209 * @tparam tChannels The number of frame channels, with range [1, infinity)
210 */
211 template <typename T, typename TSum, unsigned int tChannels>
212 static void sumFrameSubset(const T* frame, const unsigned int width, TSum* sumValues, Lock* lock, const unsigned int framePaddingElements, const unsigned int firstRow, const unsigned int numberRows);
213
214 /**
215 * Adds the subset of individual pixel values of a given source frame to a target frame.
216 * @param source The source frame which pixels values are copied, must be valid
217 * @param target The target frame to which the source pixel values will be added, individually for each pixel and channel, must be valid
218 * @param width The width of both frames in pixels, with range [1, infinity)
219 * @param height The height of both frames in pixels, with range [1, infinity)
220 * @param sourcePaddingElements The number of padding elements at the end of each source row, in elements, with range [0, infinity)
221 * @param targetPaddingElements The number of padding elements at the end of each target row, in elements, with range [0, infinity)
222 * @param firstRow The first row to be handled, with range [0, height - 1]
223 * @param numberRows The number of rows to be handled, with range [1, height - firstRow]
224 * @tparam TSource The data type of the elements of the source frame
225 * @tparam TTarget The data type of the elements of the target frame
226 * @tparam tChannels The number of frame data channels, with range [1, infinity)
227 */
228 template <typename TSource, typename TTarget, unsigned int tChannels>
229 static void addToFrameSubset(const TSource* const source, TTarget* const target, const unsigned int width, const unsigned int height, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, const unsigned int firstRow, const unsigned int numberRows);
230
231 /**
232 * Adds the subset of individual pixel values of a given source frame to a target frame (with denominators as separate block) if the corresponding mask pixel is valid.
233 * @param source The source frame from which pixels values are copied
234 * @param mask The mask frame defining whether a source pixel is copied or not (and whether the corresponding normalization denominator of the target frame is increased by 1)
235 * @param target The target frame to which the source pixel values will be added
236 * @param denominators The denominator values individually for each pixel
237 * @param width The width of both frames in pixels
238 * @param height The height of both frames in pixels
239 * @param sourcePaddingElements The number of padding elements of the source frame, range: [0, infinity)
240 * @param maskPaddingElements The number of padding elements of the mask frame, range: [0, infinity)
241 * @param targetPaddingElements The number of padding elements of the target frame, range: [0, infinity)
242 * @param denominatorsPaddingElements The number of padding elements of the denominators frame, range: [0, infinity)
243 * @param nonMaskValue The value indicating invalid mask pixels, i.e. pixels that should not be processed by this function, all other values will be interpreted as valid, range: [0, 255]
244 * @param firstRow The first row to be handled
245 * @param numberRows The number of rows to be handled
246 * @tparam tChannels The number of frame data channels
247 */
248 template <unsigned int tChannels>
249 static void addToFrameIndividuallyBlock8BitPerChannelSubset(const uint8_t* source, const uint8_t* mask, unsigned int* target, unsigned int* denominators, const unsigned int width, const unsigned int height, const unsigned int sourcePaddingElements, const unsigned int maskPaddingElements, const unsigned int targetPaddingElements, const unsigned int denominatorsPaddingElements, const uint8_t nonMaskValue, const unsigned int firstRow, const unsigned int numberRows);
250
251 /**
252 * Adds the subset of individual pixel values of a given source frame to a target frame (with zipped denominator).
253 * @param source The source frame from which pixels values are copied
254 * @param targetWithDenominator The target frame to which the source pixel values will be added, with individual denominator values, the denominator of each pixel is increased by 1
255 * @param width The width of both frames in pixels
256 * @param height The height of both frames in pixels
257 * @param firstRow The first row to be handled
258 * @param numberRows The number of rows to be handled
259 * @tparam tChannels The number of frame data channels, not including the extra channel for the denominator value
260 */
261 template <unsigned int tChannels>
262 static void addToFrameIndividuallyZipped8BitPerChannelSubset(const uint8_t* source, unsigned int* targetWithDenominator, const unsigned int width, const unsigned int height, const unsigned int firstRow, const unsigned int numberRows);
263
264 /**
265 * Adds the subset of individual pixel values of a given source frame to a target frame (with zipped denominator) if the corresponding mask pixel is valid.
266 * @param source The source frame from which pixels values are copied
267 * @param mask The mask frame defining whether a source pixel is copied or not (and whether the corresponding normalization denominator of the target frame is increased by 1)
268 * @param targetWithDenominator The target frame to which the source pixel values will be added, with individual denominator values
269 * @param width The width of both frames in pixels
270 * @param height The height of both frames in pixels
271 * @param firstRow The first row to be handled
272 * @param numberRows The number of rows to be handled
273 * @tparam tChannels The number of frame data channels, not including the extra channel for the denominator value
274 */
275 template <unsigned int tChannels>
276 static void addToFrameIndividuallyZipped8BitPerChannelSubset(const uint8_t* source, const uint8_t* mask, unsigned int* targetWithDenominator, const unsigned int width, const unsigned int height, const unsigned int firstRow, const unsigned int numberRows);
277
278 /**
279 * Normalizes a subset of the pixels values of a given (accumulated frame) by a given denominator.
280 * @param source The accumulated source frame which has to be normalized, must be valid
281 * @param target The target frame which receives the normalized source frame, must be valid
282 * @param denominator The denominator which is used to normalize each frame pixel and channel of the source frame, with range [1, infinity)
283 * @param width The width of both frames in pixels, with range [1, infinity)
284 * @param height The height of both frames in pixels, with range [1, infinity)
285 * @param sourcePaddingElements The number of padding elements at the end of each source row, in elements, with range [0, infinity)
286 * @param targetPaddingElements The number of padding elements at the end of each target row, in elements, with range [0, infinity)
287 * @param firstRow The first row to be handled, with range [0, height - 1]
288 * @param numberRows The number of rows to be handled, with range [1, height - firstRow]
289 * @tparam TSource The data type of the elements of the source frame
290 * @tparam TTarget The data type of the elements of the target frame
291 * @tparam tChannels The number of frame data channels, with range [1, infinity)
292 */
293 template <typename TSource, typename TTarget, unsigned int tChannels>
294 static void normalizeFrameSubset(const TSource* const source, TTarget* const target, const TSource denominator, unsigned int width, const unsigned int height, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, const unsigned int firstRow, const unsigned int numberRows);
295
296 /**
297 * Normalizes a subset of the pixels values of a given (accumulated frame) by individual denominator values.
298 * @param source The accumulated source frame which has to be normalized
299 * @param denominators The normalization denominators individually for each pixel, with range [0, infinity)
300 * @param target The target frame which receives the normalized source frame
301 * @param width The width of both frames in pixels
302 * @param height The height of both frames in pixels
303 * @param zeroValue The target pixel value for pixels with denominator value equal to zero
304 * @param firstRow The first row to be handled
305 * @param numberRows The number of rows to be handled
306 * @tparam tChannels The number of frame data channels
307 */
308 template <unsigned int tChannels>
309 static void normalizeFrameIndividually8BitPerChannelSubset(const unsigned int* source, const unsigned int* denominators, uint8_t* target, const unsigned int width, const unsigned int height, const uint8_t* zeroValue, const unsigned int firstRow, const unsigned int numberRows);
310
311 /**
312 * Normalizes a subset of the pixels values of a given (accumulated frame) by individual denominator values.
313 * @param sourceWithDenominator The accumulated source frame together with the individual denominator values
314 * @param target The target frame which receives the normalized source frame
315 * @param width The width of both frames in pixels
316 * @param height The height of both frames in pixels
317 * @param zeroValue The target pixel value for pixels with denominator value equal to zero
318 * @param firstRow The first row to be handled
319 * @param numberRows The number of rows to be handled
320 * @tparam tChannels The number of frame data channels, not including the extra channel for the denominator value
321 */
322 template <unsigned int tChannels>
323 static void normalizeFrameIndividually8BitPerChannelSubset(const unsigned int* sourceWithDenominator, uint8_t* target, const unsigned int width, const unsigned int height, const uint8_t* zeroValue, const unsigned int firstRow, const unsigned int numberRows);
324};
325
326template <typename T, typename TMean, unsigned int tChannels>
327void FrameMean::meanValue(const T* frame, const unsigned int width, const unsigned int height, TMean* meanValues, const unsigned int framePaddingElements, Worker* worker)
328{
329 static_assert(tChannels > 0u, "Invalid channel number!");
330
331 ocean_assert(frame != nullptr && meanValues != nullptr);
332 ocean_assert(width > 0u && height > 0u);
333
334 typedef typename NextLargerTyper<T>::TypePerformance TSum;
335
336 TSum sumValues[tChannels];
337 for (unsigned int n = 0u; n < tChannels; ++n)
338 {
339 sumValues[n] = TSum(0);
340 }
341
342 if (worker)
343 {
344 Lock lock;
345 worker->executeFunction(Worker::Function::createStatic(sumFrameSubset<T, TSum, tChannels>, frame, width, sumValues, &lock, framePaddingElements, 0u, 0u), 0u, height, 5u, 6u, 40u);
346 }
347 else
348 {
349 sumFrameSubset<T, TSum, tChannels>(frame, width, sumValues, nullptr, framePaddingElements, 0u, height);
350 }
351
352 const unsigned int pixels = width * height;
353
354 for (unsigned int n = 0u; n < tChannels; ++n)
355 {
356 // we apply a simple division for floating point values
357 // and add a rounding for non floating point values
358
359 if constexpr (std::is_same<float, TMean>::value || std::is_same<double, TMean>::value)
360 {
361 meanValues[n] = TMean(double(sumValues[n]) / double(pixels));
362 }
363 else
364 {
365 meanValues[n] = TMean((sumValues[n] + TSum(pixels) / TSum(2)) / TSum(pixels));
366 }
367 }
368}
369
370template <unsigned int tChannels>
371Frame FrameMean::meanFrame8BitPerChannel(FrameProviderInterface& frameProviderInterface, const FrameType::PixelFormat& targetPixelFormat, const unsigned int firstFrameIndex, const unsigned int lastFrameIndex, Worker* worker, bool* abort)
372{
373 static_assert(tChannels >= 1u, "Invalid channel number!");
374
375 ocean_assert(frameProviderInterface.isInitialized());
376 ocean_assert(firstFrameIndex <= lastFrameIndex);
377
378 ocean_assert(FrameType::channels(targetPixelFormat) == tChannels);
379
380 const FrameType sourceFrameType = frameProviderInterface.synchronFrameTypeRequest(10, abort);
381 ocean_assert(sourceFrameType.isValid());
382
383 const unsigned int interfaceNumberFrames = frameProviderInterface.synchronFrameNumberRequest(10, abort);
384 ocean_assert(lastFrameIndex < interfaceNumberFrames);
385
386 const unsigned int meanFrames = lastFrameIndex - firstFrameIndex + 1u;
387 ocean_assert(meanFrames >= 1u && meanFrames < 16843010u);
388
389 const unsigned int width = sourceFrameType.width();
390 const unsigned int height = sourceFrameType.height();
391
392 const FrameType targetFrameType(sourceFrameType, targetPixelFormat);
393
394 ocean_assert(width > 0u && height > 0u);
395 if (width == 0u || height == 0u || meanFrames >= 16843010u || interfaceNumberFrames <= lastFrameIndex)
396 {
397 return Frame();
398 }
399
400 Frame accumulatedFrame(FrameType(width, height, FrameType::genericPixelFormat<uint32_t, tChannels>(), FrameType::ORIGIN_UPPER_LEFT));
401 accumulatedFrame.setValue(0x00u);
402
403 for (unsigned int n = firstFrameIndex; n <= lastFrameIndex; ++n)
404 {
405 const FrameRef frame(frameProviderInterface.synchronFrameRequest(n, 10, abort));
406
407 if (n + 1u <= lastFrameIndex)
408 {
409 frameProviderInterface.frameCacheRequest(n + 1u, n + 1u);
410 }
411
412 if (frame.isNull() || !frame->isValid())
413 {
414 return Frame();
415 }
416
417 Frame targetFrame;
418
419 if (!CV::FrameConverter::Comfort::convert(*frame, targetFrameType.pixelFormat(), targetFrameType.pixelOrigin(), targetFrame, CV::FrameConverter::CP_AVOID_COPY_IF_POSSIBLE, worker))
420 {
421 return Frame();
422 }
423
424 addToFrame<uint8_t, uint32_t, tChannels>(targetFrame.constdata<uint8_t>(), accumulatedFrame.data<uint32_t>(), width, height, targetFrame.paddingElements(), accumulatedFrame.paddingElements(), worker);
425 }
426
427 Frame result(targetFrameType);
428
429 normalizeFrame<uint32_t, uint8_t, tChannels>(accumulatedFrame.constdata<uint32_t>(), result.data<uint8_t>(), meanFrames, width, height, accumulatedFrame.paddingElements(), result.paddingElements(), worker);
430
431 return result;
432}
433
434template <typename TSource, typename TTarget, unsigned int tChannels>
435inline void FrameMean::addToFrame(const TSource* const source, TTarget* const target, const unsigned int width, const unsigned int height, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, Worker* worker)
436{
437 static_assert(sizeof(TSource) <= sizeof(TTarget), "Invalid data type!");
438 static_assert(tChannels >= 1u, "Invalid channel number!");
439
440 ocean_assert(source != nullptr && target != nullptr);
441 ocean_assert(width != 0u && height != 0u);
442
443 if (worker)
444 {
445 worker->executeFunction(Worker::Function::createStatic(&FrameMean::addToFrameSubset<TSource, TTarget, tChannels>, source, target, width, height, sourcePaddingElements, targetPaddingElements, 0u, 0u), 0u, height);
446 }
447 else
448 {
449 addToFrameSubset<TSource, TTarget, tChannels>(source, target, width, height, sourcePaddingElements, targetPaddingElements, 0u, height);
450 }
451}
452
453template <unsigned int tChannels>
454inline void FrameMean::addToFrameIndividually8BitPerChannel(const uint8_t* source, const uint8_t* mask, unsigned int* target, unsigned int* denominators, const unsigned int width, const unsigned int height, const unsigned int sourcePaddingElements, const unsigned int maskPaddingElements, const unsigned int targetPaddingElements, const unsigned int denominatorsPaddingElements, const uint8_t nonMaskValue, Worker* worker)
455{
456 static_assert(tChannels >= 1u, "Invalid channel number!");
457
458 ocean_assert(source && mask && target && denominators);
459 ocean_assert(width != 0u && height != 0u);
460
461 if (worker)
462 {
463 worker->executeFunction(Worker::Function::createStatic(&FrameMean::addToFrameIndividuallyBlock8BitPerChannelSubset<tChannels>, source, mask, target, denominators, width, height, sourcePaddingElements, maskPaddingElements, targetPaddingElements, denominatorsPaddingElements, nonMaskValue, 0u, 0u), 0u, height);
464 }
465 else
466 {
467 addToFrameIndividuallyBlock8BitPerChannelSubset<tChannels>(source, mask, target, denominators, width, height, sourcePaddingElements, maskPaddingElements, targetPaddingElements, denominatorsPaddingElements, nonMaskValue, 0u, height);
468 }
469}
470
471template <unsigned int tChannels>
472inline void FrameMean::addToFrameIndividually8BitPerChannel(const uint8_t* source, const uint8_t* mask, unsigned int* targetWithDenominator, const unsigned int width, const unsigned int height, Worker* worker)
473{
474 static_assert(tChannels >= 1u, "Invalid channel number!");
475
476 ocean_assert(source && mask && targetWithDenominator);
477 ocean_assert(width != 0u && height != 0u);
478
479 if (worker)
480 {
481 worker->executeFunction(Worker::Function::createStatic(&FrameMean::addToFrameIndividuallyZipped8BitPerChannelSubset<tChannels>, source, mask, targetWithDenominator, width, height, 0u, 0u), 0u, height, 5u, 6u);
482 }
483 else
484 {
485 addToFrameIndividuallyZipped8BitPerChannelSubset<tChannels>(source, mask, targetWithDenominator, width, height, 0u, height);
486 }
487}
488
489template <unsigned int tChannels>
490inline void FrameMean::addToFrameIndividually8BitPerChannel(const uint8_t* source, unsigned int* targetWithDenominator, const unsigned int width, const unsigned int height, Worker* worker)
491{
492 static_assert(tChannels >= 1u, "Invalid channel number!");
493
494 ocean_assert(source && targetWithDenominator);
495 ocean_assert(width != 0u && height != 0u);
496
497 if (worker)
498 {
499 worker->executeFunction(Worker::Function::createStatic(&FrameMean::addToFrameIndividuallyZipped8BitPerChannelSubset<tChannels>, source, targetWithDenominator, width, height, 0u, 0u), 0u, height, 4u, 5u);
500 }
501 else
502 {
503 addToFrameIndividuallyZipped8BitPerChannelSubset<tChannels>(source, targetWithDenominator, width, height, 0u, height);
504 }
505}
506
507template <typename TSource, typename TTarget, unsigned int tChannels>
508inline void FrameMean::normalizeFrame(const TSource* const source, TTarget* const target, const TSource denominator, unsigned int width, const unsigned int height, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, Worker* worker)
509{
510 static_assert(tChannels >= 1u, "Invalid channel number!");
511
512 ocean_assert(source != nullptr && target != nullptr);
513 ocean_assert(width != 0u && height != 0u);
514
515 if (worker)
516 {
517 worker->executeFunction(Worker::Function::createStatic(&FrameMean::normalizeFrameSubset<TSource, TTarget, tChannels>, source, target, denominator, width, height, sourcePaddingElements, targetPaddingElements, 0u, 0u), 0u, height);
518 }
519 else
520 {
521 normalizeFrameSubset<TSource, TTarget, tChannels>(source, target, denominator, width, height, sourcePaddingElements, targetPaddingElements, 0u, height);
522 }
523}
524
525template <unsigned int tChannels>
526inline void FrameMean::normalizeFrameIndividually8BitPerChannel(const unsigned int* source, const unsigned int* denominators, uint8_t* target, const unsigned int width, const unsigned int height, const uint8_t* zeroValue, Worker* worker)
527{
528 static_assert(tChannels >= 1u, "Invalid channel number!");
529
530 ocean_assert(source && denominators && target);
531 ocean_assert(width != 0u && height != 0u);
532
533 const uint8_t zeroPixel[tChannels] = {0u};
534
535 if (worker)
536 {
537 worker->executeFunction(Worker::Function::createStatic(&FrameMean::normalizeFrameIndividually8BitPerChannelSubset<tChannels>, source, denominators, target, width, height, zeroValue ? zeroValue : zeroPixel, 0u, 0u), 0u, height, 6u, 7u);
538 }
539 else
540 {
541 normalizeFrameIndividually8BitPerChannelSubset<tChannels>(source, denominators, target, width, height, zeroValue ? zeroValue : zeroPixel, 0u, height);
542 }
543}
544
545template <unsigned int tChannels>
546inline void FrameMean::normalizeFrameIndividually8BitPerChannel(const unsigned int* sourceWithDenominator, uint8_t* target, const unsigned int width, const unsigned int height, const uint8_t* zeroValue, Worker* worker)
547{
548 static_assert(tChannels >= 1u, "Invalid channel number!");
549
550 ocean_assert(sourceWithDenominator && target);
551 ocean_assert(width != 0u && height != 0u);
552
553 const uint8_t zeroPixel[tChannels] = {0u};
554
555 if (worker)
556 {
557 worker->executeFunction(Worker::Function::createStatic(&FrameMean::normalizeFrameIndividually8BitPerChannelSubset<tChannels>, sourceWithDenominator, target, width, height, zeroValue ? zeroValue : zeroPixel, 0u, 0u), 0u, height, 5u, 6u);
558 }
559 else
560 {
561 normalizeFrameIndividually8BitPerChannelSubset<tChannels>(sourceWithDenominator, target, width, height, zeroValue ? zeroValue : zeroPixel, 0u, height);
562 }
563}
564
565template <typename T, typename TSum, unsigned int tChannels>
566void FrameMean::sumFrameSubset(const T* frame, const unsigned int width, TSum* sumValues, Lock* lock, const unsigned int framePaddingElements, const unsigned int firstRow, const unsigned int numberRows)
567{
568 static_assert(tChannels >= 1u, "Invalid channel number!");
569
570 ocean_assert(frame != nullptr && sumValues != nullptr);
571 ocean_assert(width > 0u);
572
573 TSum localSumValues[tChannels];
574
575 for (unsigned int n = 0u; n < tChannels; ++n)
576 {
577 localSumValues[n] = TSum(0);
578 }
579
580 const unsigned int frameStrideElements = width * tChannels + framePaddingElements;
581
582 frame += firstRow * frameStrideElements;
583
584 for (unsigned int y = firstRow; y < firstRow + numberRows; ++y)
585 {
586 const T* frameRowEnd = frame + width * tChannels;
587
588 while (frame != frameRowEnd)
589 {
590 ocean_assert(frame < frameRowEnd);
591
592 for (unsigned int n = 0u; n < tChannels; ++n)
593 {
594#ifdef OCEAN_DEBUG
595 // checking for an overflow
596
597 if (TSum(frame[n]) > TSum(0))
598 {
599 ocean_assert(NumericT<TSum>::maxValue() - TSum(frame[n]) > localSumValues[n]);
600 }
601 else
602 {
603 ocean_assert(NumericT<TSum>::minValue() - TSum(frame[n]) <= localSumValues[n]);
604 }
605#endif
606
607 localSumValues[n] += TSum(frame[n]);
608 }
609
610 frame += tChannels;
611 }
612
613 frame += framePaddingElements;
614 }
615
616 const OptionalScopedLock scopedLock(lock);
617
618 for (unsigned int n = 0u; n < tChannels; ++n)
619 {
620 sumValues[n] += localSumValues[n];
621 }
622}
623
624template <typename TSource, typename TTarget, unsigned int tChannels>
625void FrameMean::addToFrameSubset(const TSource* const source, TTarget* const target, const unsigned int width, const unsigned int height, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, const unsigned int firstRow, const unsigned int numberRows)
626{
627 static_assert(sizeof(TSource) <= sizeof(TTarget), "Invalid data type!");
628 static_assert(tChannels >= 1u, "Invalid channel number!");
629
630 ocean_assert(source != nullptr && target != nullptr);
631 ocean_assert_and_suppress_unused(firstRow + numberRows <= height, height);
632
633 const unsigned int sourceStrideElements = width * tChannels + sourcePaddingElements;
634 const unsigned int targetStrideElements = width * tChannels + targetPaddingElements;
635
636 for (unsigned int y = firstRow; y < firstRow + numberRows; ++y)
637 {
638 const TSource* const sourceRow = source + y * sourceStrideElements;
639 TTarget* const targetRow = target + y * targetStrideElements;
640
641 for (unsigned int n = 0u; n < width * tChannels; ++n)
642 {
643 targetRow[n] = targetRow[n] + TTarget(sourceRow[n]);
644 }
645 }
646}
647
648template <unsigned int tChannels>
649void FrameMean::addToFrameIndividuallyBlock8BitPerChannelSubset(const uint8_t* source, const uint8_t* mask, unsigned int* target, unsigned int* denominators, const unsigned int width, const unsigned int height, const unsigned int sourcePaddingElements, const unsigned int maskPaddingElements, const unsigned int targetPaddingElements, const unsigned int denominatorsPaddingElements, const uint8_t nonMaskValue, const unsigned int firstRow, const unsigned int numberRows)
650{
651 static_assert(tChannels >= 1u, "Invalid channel number!");
652
653 ocean_assert(source && mask && target && denominators);
654 ocean_assert_and_suppress_unused(firstRow + numberRows <= height, height);
655
656 const unsigned int sourceStrideElements = width * tChannels + sourcePaddingElements;
657 const unsigned int maskStrideElements = width + maskPaddingElements;
658 const unsigned int targetStrideElements = width * tChannels + targetPaddingElements;
659 const unsigned int denominatorsStrideElements = width + denominatorsPaddingElements;
660
661 target += firstRow * targetStrideElements;
662 denominators += firstRow * denominatorsStrideElements;
663
664 source += firstRow * sourceStrideElements;
665 mask += firstRow * maskStrideElements;
666
667 for (unsigned int rowIndex = firstRow; rowIndex < firstRow + numberRows; ++rowIndex)
668 {
669 const uint8_t* const sourceRowEnd = source + width * tChannels;
670
671 while (source != sourceRowEnd)
672 {
673 ocean_assert(source < sourceRowEnd);
674
675 if (*mask++ != nonMaskValue)
676 {
677 for (unsigned int n = 0u; n < tChannels; ++n)
678 {
679 target[n] += source[n];
680 }
681
682 (*denominators)++;
683 }
684
685 target += tChannels;
686 denominators++;
687 source += tChannels;
688 }
689
690 target += targetPaddingElements;
691 denominators += denominatorsPaddingElements;
692
693 source += sourcePaddingElements;
694 mask += maskPaddingElements;
695 }
696}
697
698template <unsigned int tChannels>
699void FrameMean::addToFrameIndividuallyZipped8BitPerChannelSubset(const uint8_t* source, unsigned int* targetWithDenominator, const unsigned int width, const unsigned int height, const unsigned int firstRow, const unsigned int numberRows)
700{
701 static_assert(tChannels >= 1u, "Invalid channel number!");
702
703 ocean_assert(source && targetWithDenominator);
704 ocean_assert_and_suppress_unused(firstRow + numberRows <= height, height);
705
706 targetWithDenominator += firstRow * width * (tChannels + 1u);
707
708 source += firstRow * width * tChannels;
709
710 const uint8_t* const sourceEnd = source + numberRows * width * tChannels;
711
712 while (source != sourceEnd)
713 {
714 ocean_assert(source < sourceEnd);
715
716 for (unsigned int n = 0u; n < tChannels; ++n)
717 *targetWithDenominator++ += *source++;
718
719 (*targetWithDenominator++)++;
720 }
721}
722
723template <unsigned int tChannels>
724void FrameMean::addToFrameIndividuallyZipped8BitPerChannelSubset(const uint8_t* source, const uint8_t* mask, unsigned int* targetWithDenominator, const unsigned int width, const unsigned int height, const unsigned int firstRow, const unsigned int numberRows)
725{
726 static_assert(tChannels >= 1u, "Invalid channel number!");
727
728 ocean_assert(source && mask && targetWithDenominator);
729 ocean_assert_and_suppress_unused(firstRow + numberRows <= height, height);
730
731 targetWithDenominator += firstRow * width * (tChannels + 1u);
732
733 source += firstRow * width * tChannels;
734 mask += firstRow * width;
735
736 const uint8_t* const sourceEnd = source + numberRows * width * tChannels;
737
738 while (source != sourceEnd)
739 {
740 ocean_assert(source < sourceEnd);
741
742 if (*mask++)
743 {
744 for (unsigned int n = 0u; n < tChannels; ++n)
745 {
746 targetWithDenominator[n] += source[n];
747 }
748
749 targetWithDenominator[tChannels]++;
750 }
751
752 targetWithDenominator += tChannels + 1u;
753 source += tChannels;
754 }
755}
756
757template <typename TSource, typename TTarget, unsigned int tChannels>
758void FrameMean::normalizeFrameSubset(const TSource* const source, TTarget* const target, const TSource denominator, unsigned int width, const unsigned int height, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, const unsigned int firstRow, const unsigned int numberRows)
759{
760 static_assert(tChannels >= 1u, "Invalid channel number!");
761
762 ocean_assert(source != nullptr && target != nullptr);
763 ocean_assert(denominator != 0u);
764 ocean_assert_and_suppress_unused(firstRow + numberRows <= height, height);
765
766 const TSource denominator_2 = denominator / TSource(2);
767
768 const unsigned int sourceStrideElements = width * tChannels + sourcePaddingElements;
769 const unsigned int targetStrideElements = width * tChannels + targetPaddingElements;
770
771 for (unsigned int y = firstRow; y < firstRow + numberRows; ++y)
772 {
773 const TSource* const sourceRow = source + y * sourceStrideElements;
774 TTarget* const targetRow = target + y * targetStrideElements;
775
776 for (unsigned int n = 0u; n < width * tChannels; ++n)
777 {
778 if (std::is_signed<TSource>::value)
779 {
780 targetRow[n] = TTarget(sourceRow[n] / denominator);
781 }
782 else
783 {
784 targetRow[n] = TTarget((sourceRow[n] + denominator_2) / denominator);
785 }
786 }
787 }
788}
789
790template <unsigned int tChannels>
791void FrameMean::normalizeFrameIndividually8BitPerChannelSubset(const unsigned int* source, const unsigned int* denominators, uint8_t* target, const unsigned int width, const unsigned int height, const uint8_t* zeroValue, const unsigned int firstRow, const unsigned int numberRows)
792{
793 static_assert(tChannels >= 1u, "Invalid channel number!");
794
795 ocean_assert(source && denominators && target && zeroValue);
796 ocean_assert_and_suppress_unused(firstRow + numberRows <= height, height);
797
798 typedef typename DataType<uint8_t, tChannels>::Type PixelType;
799
800 target += firstRow * width * tChannels;
801 denominators += firstRow * width;
802 source += firstRow * width * tChannels;
803
804 const unsigned int* const sourceEnd = source + numberRows * width * tChannels;
805
806 while (source != sourceEnd)
807 {
808 ocean_assert(source < sourceEnd);
809
810 if (*denominators)
811 {
812 const unsigned int denominator = *denominators;
813 const unsigned int denominator_2 = denominator / 2u;
814
815 for (unsigned int n = 0u; n < tChannels; ++n)
816 {
817 target[n] = (uint8_t)((source[n] + denominator_2) / denominator);
818 }
819 }
820 else
821 {
822 *((PixelType*)target) = *((PixelType*)zeroValue);
823 }
824
825 target += tChannels;
826 source += tChannels;
827
828 denominators++;
829 }
830}
831
832template <unsigned int tChannels>
833void FrameMean::normalizeFrameIndividually8BitPerChannelSubset(const unsigned int* sourceWithDenominator, uint8_t* target, const unsigned int width, const unsigned int height, const uint8_t* zeroValue, const unsigned int firstRow, const unsigned int numberRows)
834{
835 static_assert(tChannels >= 1u, "Invalid channel number!");
836
837 ocean_assert(sourceWithDenominator && target && zeroValue);
838 ocean_assert_and_suppress_unused(firstRow + numberRows <= height, height);
839
840 typedef typename DataType<uint8_t, tChannels>::Type PixelType;
841
842 target += firstRow * width * tChannels;
843 sourceWithDenominator += firstRow * width * (tChannels + 1u);
844
845 const unsigned int* const sourceEnd = sourceWithDenominator + numberRows * width * (tChannels + 1u);
846
847 while (sourceWithDenominator != sourceEnd)
848 {
849 ocean_assert(sourceWithDenominator < sourceEnd);
850
851 if (sourceWithDenominator[tChannels])
852 {
853 const unsigned int denominator = sourceWithDenominator[tChannels];
854 const unsigned int denominator_2 = denominator / 2u;
855
856 for (unsigned int n = 0u; n < tChannels; ++n)
857 {
858 target[n] = (uint8_t)((sourceWithDenominator[n] + denominator_2) / denominator);
859 }
860 }
861 else
862 {
863 *((PixelType*)target) = *((PixelType*)zeroValue);
864 }
865
866 target += tChannels;
867 sourceWithDenominator += (tChannels + 1u);
868 }
869}
870
871}
872
873}
874
875#endif // META_OCEAN_CV_FRAME_MEAN_H
static bool convert(const Frame &source, const FrameType::PixelFormat targetPixelFormat, const FrameType::PixelOrigin targetPixelOrigin, Frame &target, const bool forceCopy=true, Worker *worker=nullptr, const Options &options=Options())
Converts a frame with arbitrary dimension, pixel format and pixel origin into a frame with the same d...
@ CP_AVOID_COPY_IF_POSSIBLE
Tries to avoid copying the frame data whenever possible.
Definition FrameConverter.h:96
This class implements functions allowing to determine e.g., the mean pixel value of a frame of a mean...
Definition FrameMean.h:30
static void normalizeFrame(const TSource *const source, TTarget *const target, const TSource denominator, unsigned int width, const unsigned int height, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, Worker *worker=nullptr)
Normalizes the pixels values of a given (accumulated frame) by a given denominator.
Definition FrameMean.h:508
static void addToFrameSubset(const TSource *const source, TTarget *const target, const unsigned int width, const unsigned int height, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, const unsigned int firstRow, const unsigned int numberRows)
Adds the subset of individual pixel values of a given source frame to a target frame.
Definition FrameMean.h:625
static void normalizeFrameSubset(const TSource *const source, TTarget *const target, const TSource denominator, unsigned int width, const unsigned int height, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, const unsigned int firstRow, const unsigned int numberRows)
Normalizes a subset of the pixels values of a given (accumulated frame) by a given denominator.
Definition FrameMean.h:758
static void normalizeFrameIndividually8BitPerChannel(const unsigned int *source, const unsigned int *denominators, uint8_t *target, const unsigned int width, const unsigned int height, const uint8_t *zeroValue=nullptr, Worker *worker=nullptr)
Normalizes the pixels values of a given (accumulated frame) by individual denominator values.
Definition FrameMean.h:526
static Frame meanFrame8BitPerChannel(FrameProviderInterface &frameProviderInterface, const FrameType::PixelFormat &targetPixelFormat, const unsigned int firstFrameIndex, const unsigned int lastFrameIndex, Worker *worker=nullptr, bool *abort=nullptr)
Determines the mean frame for a given set of frames.
Definition FrameMean.h:371
static void normalizeFrameIndividually8BitPerChannelSubset(const unsigned int *source, const unsigned int *denominators, uint8_t *target, const unsigned int width, const unsigned int height, const uint8_t *zeroValue, const unsigned int firstRow, const unsigned int numberRows)
Normalizes a subset of the pixels values of a given (accumulated frame) by individual denominator val...
Definition FrameMean.h:791
static void sumFrameSubset(const T *frame, const unsigned int width, TSum *sumValues, Lock *lock, const unsigned int framePaddingElements, const unsigned int firstRow, const unsigned int numberRows)
Sums the pixel values in a subset of a given frame.
Definition FrameMean.h:566
static Frame meanFrame(FrameProviderInterface &frameProviderInterface, const FrameType::PixelFormat &targetPixelFormat, const unsigned int firstFrameIndex, const unsigned int lastFrameIndex, Worker *worker=nullptr, bool *abort=nullptr)
Determines the mean frame for a given set of frames.
static void addToFrameIndividuallyBlock8BitPerChannelSubset(const uint8_t *source, const uint8_t *mask, unsigned int *target, unsigned int *denominators, const unsigned int width, const unsigned int height, const unsigned int sourcePaddingElements, const unsigned int maskPaddingElements, const unsigned int targetPaddingElements, const unsigned int denominatorsPaddingElements, const uint8_t nonMaskValue, const unsigned int firstRow, const unsigned int numberRows)
Adds the subset of individual pixel values of a given source frame to a target frame (with denominato...
Definition FrameMean.h:649
static void addToFrameIndividually8BitPerChannel(const uint8_t *source, const uint8_t *mask, unsigned int *target, unsigned int *denominators, const unsigned int width, const unsigned int height, const unsigned int sourcePaddingElements, const unsigned int maskPaddingElements, const unsigned int targetPaddingElements, const unsigned int denominatorsPaddingElements, const uint8_t nonMaskValue, Worker *worker=nullptr)
Adds the individual pixel values of a given source frame to a target frame if the corresponding mask ...
Definition FrameMean.h:454
static void addToFrameIndividuallyZipped8BitPerChannelSubset(const uint8_t *source, unsigned int *targetWithDenominator, const unsigned int width, const unsigned int height, const unsigned int firstRow, const unsigned int numberRows)
Adds the subset of individual pixel values of a given source frame to a target frame (with zipped den...
Definition FrameMean.h:699
static bool addToFrameIndividually(const Frame &source, const Frame &mask, Frame &target, Frame &denominators, const uint8_t nonMaskValue, Worker *worker=nullptr)
Adds the individual pixel values of a given source frame to a target frame if the corresponding mask ...
static void meanValue(const T *frame, const unsigned int width, const unsigned int height, TMean *meanValues, const unsigned int framePaddingElements, Worker *worker=nullptr)
Determines the mean pixel value for a given frame.
Definition FrameMean.h:327
static void addToFrame(const TSource *const source, TTarget *const target, const unsigned int width, const unsigned int height, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, Worker *worker=nullptr)
Adds the individual pixel values of a given source frame to a target frame.
Definition FrameMean.h:435
This class defines an abstract interface allowing to request frames from any kind of frame provider.
Definition FrameProviderInterface.h:38
virtual bool isInitialized()=0
Returns whether the internal information of this interface has been initialized already and whether r...
virtual unsigned int synchronFrameNumberRequest(const double timeout=10.0, bool *abort=nullptr)=0
Invokes a synchronous frame number request.
virtual FrameType synchronFrameTypeRequest(const double timeout=10.0, bool *abort=nullptr)=0
Invokes a synchronous frame type request.
virtual void frameCacheRequest(const unsigned int index, const int range)
Invokes a suggestion to pre-load or to cache some frames that might be requested soon.
virtual FrameRef synchronFrameRequest(const unsigned int index, const double timeout=10.0, bool *abort=nullptr)=0
Invokes a synchronous frame request.
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 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
T * data(const unsigned int planeIndex=0u)
Returns a pointer to the pixel data of a specific plane.
Definition Frame.h:4239
bool setValue(const uint8_t value, const unsigned int planeIndex=0u, const bool skipPaddingData=true)
Sets the memory of the frame to a specified byte value (the memory of one plane).
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
PixelFormat pixelFormat() const
Returns the pixel format of the frame.
Definition Frame.h:3180
@ ORIGIN_UPPER_LEFT
The first pixel lies in the upper left corner, the last pixel in the lower right corner.
Definition Frame.h:1050
unsigned int height() const
Returns the height of the frame in pixel.
Definition Frame.h:3175
bool isValid() const
Returns whether this frame type is valid.
Definition Frame.h:3242
unsigned int channels() const
Returns the number of individual channels the frame has.
Definition Frame.h:3200
This class implements a recursive lock object.
Definition Lock.h:31
T TypePerformance
Definition of the data type for the next larger data type regarding performance.
Definition DataType.h:261
This class provides basic numeric functionalities.
Definition Numeric.h:57
This template class implements a object reference with an internal reference counter.
Definition base/ObjectRef.h:58
bool isNull() const
Returns whether this object reference holds no internal object.
Definition base/ObjectRef.h:390
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.
The namespace covering the entire Ocean framework.
Definition Accessor.h:15
Default definition of a type with tBytes bytes.
Definition DataType.h:32