Ocean
Loading...
Searching...
No Matches
FrameTracker.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_TRACKING_OFFLINE_FRAME_TRACKER_H
9#define META_OCEAN_TRACKING_OFFLINE_FRAME_TRACKER_H
10
13
15
18
21
22namespace Ocean
23{
24
25namespace Tracking
26{
27
28namespace Offline
29{
30
31// Forward declaration.
32class FrameTracker;
33
34/**
35 * Definition of a smart object reference holding a FrameTracker object.
36 * @see FrameTracker.
37 * @ingroup trackingoffline
38 */
40
41/**
42 * This class implements the base class for all visual offline tracker using frames to provide the tracking data.
43 * @ingroup trackingoffline
44 */
45class OCEAN_TRACKING_OFFLINE_EXPORT FrameTracker : virtual public OfflineTracker
46{
48
49 protected:
50
51 /**
52 * This class implements the base class for all components of a frame tracker.
53 */
55 {
56 protected:
57
58 /**
59 * Definition of individual results for the component iterations.
60 */
62 {
63 /// The iteration succeeded and thus the component proceeds with the next frame.
65 /// The iteration failed and thus also the component fails.
67 /// The iteration finished and thus also the component finishes.
68 IR_FINISHED
69 };
70
71 public:
72
73 /**
74 * Creates a new component object.
75 * @param parent The parent tracker that invokes this component
76 */
78
79 /**
80 * Destructs a tracker component object.
81 */
83
84 /**
85 * Invokes the component.
86 * The component starts at the initial frame index and proceeds frames with increasing indices, afterwards the components restarts at the initial frame index and proceeds frames with decreasing indices
87 * @param startEvent Event that is invoked at the beginning of the component
88 * @param breakEvent Event that is invoked if the component breaks
89 * @param finishEvent Event that is invoked if the component finishes
90 * @param lowerFrameIndex Index of the frame defining the lower (including) tracking boundary
91 * @param initialFrameIndex Index of the frame at that the tracking process will start
92 * @param upperFrameIndex Index of the frame defining the upper (including) tracking boundary
93 * @return True, if the component succeeded
94 */
95 virtual bool invoke(const TrackerEvent& startEvent, TrackerEvent& breakEvent, TrackerEvent& finishEvent, const unsigned int lowerFrameIndex, const unsigned int initialFrameIndex, const unsigned int upperFrameIndex);
96
97 protected:
98
99 /**
100 * Component start event function.
101 */
102 virtual bool onStart(const unsigned int lowerFrameIndex, const unsigned int initialFrameIndex, const unsigned int upperFrameIndex);
103
104 /**
105 * Component increasing start event function.
106 * This function is executed before the increasing component iterations are applied.
107 * @return True, if the start has succeeded
108 */
109 virtual bool onStartIncreasing();
110
111 /**
112 * Component decreasing start event function.
113 * This function is executed before the decreasing component iterations are applied.
114 * @return True, if the start has succeeded
115 */
116 virtual bool onStartDecreasing();
117
118 /**
119 * Iteration setup event function.
120 * This function is executed before an iteration is applied
121 * @return True, if the setup has succeeded
122 */
123 virtual bool onSetupIteration(const unsigned int index);
124
125 /**
126 * Applies one component step.
127 * @param previousIndex Index of the previous frame that has been handled in the previous iteration, -1 for the first iteration
128 * @param currentIndex Index of the current frame that is handled in this iteration
129 * @param iteration Index of the current iteration
130 * @param maximalIterations Number of maximal iterations that will be applied
131 * @return Returns the iteration result
132 */
133 virtual IterationResult onFrame(const unsigned int previousIndex, const unsigned int currentIndex, const unsigned int iteration, const unsigned int maximalIterations) = 0;
134
135 /**
136 * Component stop event function.
137 * This function is executed after the component iterations have been applied.
138 * @param lowerFrameIndex Index of the frame defining the lower (including) tracking boundary
139 * @param initialFrameIndex Index of the frame at that the tracking process will start
140 * @param upperFrameIndex Index of the frame defining the upper (including) tracking boundary
141 * @return True, if the start has succeeded
142 */
143 virtual bool onStop(const unsigned int lowerFrameIndex, const unsigned int initialFrameIndex, const unsigned int upperFrameIndex);
144
145 protected:
146
147 /// Parent tracker object that invokes this component.
149 };
150
151 /**
152 * This class implements the base class for all components of a frame tracker.
153 */
155 {
156 public:
157
158 /**
159 * Creates a new component object.
160 * @param tracker The tracker object for that this component will be executed
161 */
163
164 /**
165 * Destructor
166 */
167 inline ~FrameTrackerComponent() override;
168
169 protected:
170
171 /**
172 * Component decreasing start event function.
173 * @see TrackerComponent::onStartDecreasing().
174 */
175 bool onStartDecreasing() override;
176
177 /**
178 * Iteration setup event function.
179 * @see TrackerComponent::onSetupIteration().
180 */
181 bool onSetupIteration(const unsigned int index) override;
182
183 protected:
184
185 /// Frame that has been created in the previous component iteration.
187
188 /// Frame that has been created for the current component iteration.
190 };
191
192 /**
193 * This class implements the base class for all components of a frame tracker.
194 */
196 {
197 public:
198
199 /**
200 * Creates a new component object.
201 * @param tracker The tracker object for that this component will be executed
202 */
204
205 /**
206 * Destructor
207 */
208 inline ~FramePyramidTrackerComponent() override;
209
210 protected:
211
212 /**
213 * Component increasing start event function.
214 * @see TrackerComponent::onStartIncreasing().
215 */
216 bool onStartIncreasing() override;
217
218 /**
219 * Component decreasing start event function.
220 * @see TrackerComponent::onStartDecreasing().
221 */
222 bool onStartDecreasing() override;
223
224 /**
225 * Iteration setup event function.
226 * @see TrackerComponent::onSetupIteration().
227 */
228 bool onSetupIteration(const unsigned int index) override;
229
230 protected:
231
232 /// Frame pyramid that has been created in the previous component iteration.
234
235 /// Frame pyramid that has been created for the current component iteration.
237
238 /// Number of pyramid layers that should be created in each pyramid.
239 unsigned int framePyramidLayers_ = (unsigned int)(-1);
240 };
241
242 public:
243
244 /**
245 * Returns whether the offline tracker has finished and succeeded since the last start or has not been started yet.
246 * @return True, if so
247 * @see finished().
248 */
249 bool succeeded() const override;
250
251 /**
252 * Returns the camera object this is applied by this tracker.
253 * @return The pinhole camera object
254 */
255 inline const PinholeCamera& camera() const;
256
257 /**
258 * Returns the camera precision of this tracker.
259 * @return The pinhole camera precision, in squared pixel errors, -1 if unknown
260 */
261 inline Scalar cameraPrecision() const;
262
263 /**
264 * Starts the offline tracker.
265 * Ensure that a frame provider has been set before.<br>
266 * @return True, if succeeded
267 * @see stop(), finished(), setFrameProvider().
268 */
269 bool start() override;
270
271 /**
272 * Sets the frame provider interface that allows to request the individual frames for the offline tracker.
273 * @param frameProviderInterface Frame provider interface to be set
274 * @return True, if succeeded, returns false if the interface has been set already
275 */
276 virtual bool setFrameProviderInterface(const CV::FrameProviderInterfaceRef& frameProviderInterface);
277
278 /**
279 * Sets the frame range of this frame tracker.
280 * The range specify a subset of the entire frames that are investigated during tracking.<br>
281 * The given parameters should match the number of available frames provided by the frame provider.<br>
282 * If the frame provider provides less frames than specified by the range parameters, the parameters will be adjusted automatically.<br>
283 * The range cannot be adjusted if the tracker is active.<br>
284 * @param lowerFrameIndex Index of the first frame that will be investigated, with range [0, infinity)
285 * @param upperFrameIndex Index of the last frame that will be investigated, with range [lowerFrameIndex, infinity)
286 * @param startFrameIndex Index of the start frame at which the tracking will start, with range [lowerFrameIndex, upperFrameIndex], or -1 to use no specific start frame
287 * @return True, if succeeded
288 * @see setFrameProviderInterface()
289 */
290 virtual bool setTrackingFrameRange(const unsigned int lowerFrameIndex, const unsigned int upperFrameIndex, const unsigned int startFrameIndex = (unsigned int)(-1));
291
292 /**
293 * Sets a camera object that will be used by this tracker.
294 * @param pinholeCamera The pinhole camera object to be used
295 * @param cameraPrecision The precision of the given camera object, in squared pixel errors, should be -1 if unknown
296 * @param optimizeCamera True, to take the given camera object as rough estimation only
297 * @return True, if succeeded
298 */
299 virtual bool setCamera(const PinholeCamera& pinholeCamera, const Scalar cameraPrecision, const bool optimizeCamera);
300
301 protected:
302
303 /**
304 * Creates a new offline frame tracker object.
305 */
306 FrameTracker() = default;
307
308 /**
309 * Creates a new offline frame tracker object.
310 * @param frameProviderInterface Frame provider interface to be set
311 */
312 inline FrameTracker(const CV::FrameProviderInterfaceRef& frameProviderInterface);
313
314 /**
315 * Thread run function.
316 */
317 void threadRun() override;
318
319 /**
320 * Frame tracker run function.
321 * @param frameType Frame type of the tracking frames
322 * @return True, if the tracking succeeded
323 */
324 virtual bool applyFrameTracking(const FrameType& frameType) = 0;
325
326 /**
327 * Applies the initialization of the frame tracker.
328 * The function initializes the frame provider interface and waits until a valid frame type is known.
329 * @return The frame type of the frame provider interface, an invalid frame type if the initialization fails
330 */
332
333 /**
334 * Updates the camera of this tracker and invokes the corresponding state event(s).
335 * @param pinholeCamera The new pinhole camera for this tracker
336 */
337 virtual void updateCamera(const PinholeCamera& pinholeCamera);
338
339 protected:
340
341 /// Frame provider interface that allows to request the individual frames for this offline tracker.
343
344 /// Index of the lower frame range.
345 unsigned int lowerFrameIndex_ = (unsigned int)(-1);
346
347 /// Index of the frame at that the tracking will start, or -1 if no specific frame is specified
348 unsigned int startFrameIndex_ = (unsigned int)(-1);
349
350 /// Index of the upper frame range.
351 unsigned int upperFrameIndex_ = (unsigned int)(-1);
352
353 /// The camera object of this tracker.
355
356 /// The precision of the camera object in squared pixel errors.
357 Scalar cameraPrecision_ = Scalar(-1);
358
359 /// True, if the camera needs to be optimized during the tracking process.
360 bool optimizeCamera_ = true;
361
362 /// Succeeded state of the tracker.
363 bool succeeded_ = true;
364};
365
367{
368 // Nothing else to do.
369}
370
375
376inline FrameTracker::FrameTracker(const CV::FrameProviderInterfaceRef& frameProviderInterface) :
378 frameProviderInterface_(frameProviderInterface)
379{
380 // nothing to do here
381}
382
384{
385 return camera_;
386}
387
389{
390 return cameraPrecision_;
391}
392
393}
394
395}
396
397}
398
399#endif // META_OCEAN_TRACKING_OFFLINE_FRAME_TRACKER_H
This class implements a frame pyramid.
Definition FramePyramid.h:37
This class implements Ocean's image class.
Definition Frame.h:1808
Definition of a frame type composed by the frame dimension, pixel format and pixel origin.
Definition Frame.h:30
This template class implements a smart object reference which is a specialization of an ObjectRef obj...
Definition SmartObjectRef.h:90
This class implements the base class for all components of a frame tracker.
Definition FrameTracker.h:196
FramePyramidTrackerComponent(FrameTracker &tracker)
Creates a new component object.
CV::FramePyramid previousFramePyramid_
Frame pyramid that has been created in the previous component iteration.
Definition FrameTracker.h:233
~FramePyramidTrackerComponent() override
Destructor.
Definition FrameTracker.h:371
CV::FramePyramid currentFramePyramid_
Frame pyramid that has been created for the current component iteration.
Definition FrameTracker.h:236
bool onStartIncreasing() override
Component increasing start event function.
bool onStartDecreasing() override
Component decreasing start event function.
bool onSetupIteration(const unsigned int index) override
Iteration setup event function.
This class implements the base class for all components of a frame tracker.
Definition FrameTracker.h:155
bool onStartDecreasing() override
Component decreasing start event function.
~FrameTrackerComponent() override
Destructor.
Definition FrameTracker.h:366
Frame currentFrame_
Frame that has been created for the current component iteration.
Definition FrameTracker.h:189
Frame previousFrame_
Frame that has been created in the previous component iteration.
Definition FrameTracker.h:186
bool onSetupIteration(const unsigned int index) override
Iteration setup event function.
FrameTrackerComponent(FrameTracker &tracker)
Creates a new component object.
This class implements the base class for all components of a frame tracker.
Definition FrameTracker.h:55
virtual ~TrackerComponent()
Destructs a tracker component object.
virtual IterationResult onFrame(const unsigned int previousIndex, const unsigned int currentIndex, const unsigned int iteration, const unsigned int maximalIterations)=0
Applies one component step.
IterationResult
Definition of individual results for the component iterations.
Definition FrameTracker.h:62
@ IR_SUCCEEDED
The iteration succeeded and thus the component proceeds with the next frame.
Definition FrameTracker.h:64
@ IR_FAILED
The iteration failed and thus also the component fails.
Definition FrameTracker.h:66
virtual bool onStartIncreasing()
Component increasing start event function.
virtual bool invoke(const TrackerEvent &startEvent, TrackerEvent &breakEvent, TrackerEvent &finishEvent, const unsigned int lowerFrameIndex, const unsigned int initialFrameIndex, const unsigned int upperFrameIndex)
Invokes the component.
virtual bool onStart(const unsigned int lowerFrameIndex, const unsigned int initialFrameIndex, const unsigned int upperFrameIndex)
Component start event function.
virtual bool onStop(const unsigned int lowerFrameIndex, const unsigned int initialFrameIndex, const unsigned int upperFrameIndex)
Component stop event function.
FrameTracker & parent_
Parent tracker object that invokes this component.
Definition FrameTracker.h:148
virtual bool onSetupIteration(const unsigned int index)
Iteration setup event function.
TrackerComponent(FrameTracker &parent)
Creates a new component object.
virtual bool onStartDecreasing()
Component decreasing start event function.
This class implements the base class for all visual offline tracker using frames to provide the track...
Definition FrameTracker.h:46
const PinholeCamera & camera() const
Returns the camera object this is applied by this tracker.
Definition FrameTracker.h:383
PinholeCamera camera_
The camera object of this tracker.
Definition FrameTracker.h:354
virtual bool setTrackingFrameRange(const unsigned int lowerFrameIndex, const unsigned int upperFrameIndex, const unsigned int startFrameIndex=(unsigned int)(-1))
Sets the frame range of this frame tracker.
bool start() override
Starts the offline tracker.
virtual bool setCamera(const PinholeCamera &pinholeCamera, const Scalar cameraPrecision, const bool optimizeCamera)
Sets a camera object that will be used by this tracker.
CV::FrameProviderInterfaceRef frameProviderInterface_
Frame provider interface that allows to request the individual frames for this offline tracker.
Definition FrameTracker.h:342
Scalar cameraPrecision() const
Returns the camera precision of this tracker.
Definition FrameTracker.h:388
bool succeeded() const override
Returns whether the offline tracker has finished and succeeded since the last start or has not been s...
FrameTracker()=default
Creates a new offline frame tracker object.
void threadRun() override
Thread run function.
Scalar cameraPrecision_
The precision of the camera object in squared pixel errors.
Definition FrameTracker.h:357
virtual void updateCamera(const PinholeCamera &pinholeCamera)
Updates the camera of this tracker and invokes the corresponding state event(s).
FrameType applyFrameTrackingInitialization()
Applies the initialization of the frame tracker.
virtual bool setFrameProviderInterface(const CV::FrameProviderInterfaceRef &frameProviderInterface)
Sets the frame provider interface that allows to request the individual frames for the offline tracke...
virtual bool applyFrameTracking(const FrameType &frameType)=0
Frame tracker run function.
This class is the base class for all offline tracker objects.
Definition OfflineTracker.h:45
This class implements the base class for all tracker events.
Definition TrackerEvent.h:51
float Scalar
Definition of a scalar type.
Definition Math.h:129
SmartObjectRef< FrameTracker, OfflineTracker > FrameTrackerRef
Definition of a smart object reference holding a FrameTracker object.
Definition FrameTracker.h:39
The namespace covering the entire Ocean framework.
Definition Accessor.h:15