Ocean
Loading...
Searching...
No Matches
PointTracker.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_POINT_POINT_TRACKER_H
9#define META_OCEAN_TRACKING_POINT_POINT_TRACKER_H
10
12
13#include "ocean/base/Frame.h"
14#include "ocean/base/Lock.h"
15#include "ocean/base/Worker.h"
16
18
20
21#include "ocean/math/Vector2.h"
22
24
25namespace Ocean
26{
27
28namespace Tracking
29{
30
31namespace Point
32{
33
34/**
35 * This class implements a point tracker able to track points between concurrent frames and stores previous points in a database.
36 * The tracker determines feature points in the very first frame - and stored as object points (feature points).<br>
37 * Those points are tracked from one frame to another frame as long as possible.<br>
38 * All points are tracked from the previous frame to the current frame (and not from a common reference frame to the current frame).<br>
39 * Whenever an object point (feature point) is lost the tracker will add a new feature point in the empty region - so that the tracker is always tracking a high number of feature points.<br>
40 * Tracking is based on matches between small image patches around the image points.
41 * @ingroup trackingpoint
42 */
43class OCEAN_TRACKING_POINT_EXPORT PointTracker
44{
45 public:
46
47 /**
48 * Definition of an invalid frame index.
49 */
50 static constexpr Index32 invalidFrameIndex = Index32(-1);
51
52 /**
53 * Definition of a vector holding 2D vectors.
54 */
55 typedef std::vector<Vectors2> PointTracks;
56
57 /**
58 * Definition of individual tracking modes.
59 */
60 enum TrackingMode : uint32_t
61 {
62 /// Sum square differences tracking with 7 pixel image patch
64 /// Sum square differences tracking with 15 pixel image patch
66 /// Sum square differences tracking with 31 pixel image patch
68
69 /// Zero-mean sum square differences tracking with 7 pixel image patch
71 /// Zero-mean sum square differences tracking with 15 pixel image patch
73 /// Zero-mean sum square differences tracking with 31 pixel image patch
75
76 /// End mode.
77 TM_END
78 };
79
80 public:
81
82 /**
83 * Creates a new point tracker.
84 */
86
87 /**
88 * Move constructor.
89 * @param pointTracker The tracker object to be moved
90 */
91 PointTracker(PointTracker&& pointTracker) noexcept;
92
93 /**
94 * Copy constructor.
95 * @param pointTracker The tracker object to be copied
96 */
97 PointTracker(const PointTracker& pointTracker);
98
99 /**
100 * Sets or changes the tracking mode.
101 * @param trackingMode The new tracking mode
102 */
103 inline void setTrackingMode(const TrackingMode trackingMode);
104
105 /**
106 * Returns the current tracking mode.
107 * @return The point tracker's tracking mode
108 */
109 inline TrackingMode trackingMode() const;
110
111 /**
112 * Tracks object points (feature points) in a new frame.
113 * @param yFrame The new frame in which the points will be tracked, must have pixel format FORMAT_Y8, must be valid
114 * @param worker Optional worker object to distribute the computation
115 * @return The index of the new frame, 'invalidFrameIndex' if something went wrong
116 */
117 Index32 newFrame(const Frame& yFrame, Worker* worker = nullptr);
118
119 /**
120 * Returns the point tracks for all object points.
121 * One track is a connected path of images points belonging to one object point (feature point).
122 * @param imageIndex The index of the frame for which the tracks will be provided
123 * @param maximalLength The maximal length of each track (the maximal number of image points for each object point), with range [1, infinity)
124 * @return The tracks of tracked object points starting at the specified frame (and going into the past)
125 */
126 PointTracks pointTracks(const Index32 imageIndex, const unsigned int maximalLength = (unsigned int)(-1));
127
128 /**
129 * Removes all entries from the tracking database older than a specified frame index.
130 * @param frameIndex The index of the frame which will be the first frame in the database for which data exists
131 * @see clear().
132 */
133 void clearUpTo(const unsigned int frameIndex);
134
135 /**
136 * Clears the database containing the object points and their corresponding image points.
137 * @see clearUpTo().
138 */
139 inline void clear();
140
141 /**
142 * Returns the internal database storing the topology of the tracked points.
143 * Beware: This function is not thread-safe.
144 * @return The tracker's database
145 */
146 inline Database& database();
147
148 /**
149 * Move operator.
150 * @param pointTracker The tracker object to be moved
151 * @return Reference to this object
152 */
153 PointTracker& operator=(PointTracker&& pointTracker) noexcept;
154
155 /**
156 * Assign operator.
157 * @param pointTracker The tracker object to be moved
158 * @return Reference to this object
159 */
160 PointTracker& operator=(const PointTracker& pointTracker);
161
162 protected:
163
164 /**
165 * Detects new feature points in empty regions of the provided frame.
166 * @param yFrame The provided frame in which new feature points will be detected, must have pixel format FORMAT_Y8, must be valid
167 * @param occupancyArray The occupancy array specifying empty and non-empty regions in the frame, must be valid
168 * @param newFeaturePoints The resulting new feature points
169 * @param worker Optional worker object to distribute the computation
170 */
171 void detectNewFeaturePoints(const Frame& yFrame, Geometry::SpatialDistribution::OccupancyArray& occupancyArray, Vectors2& newFeaturePoints, Worker* worker = nullptr);
172
173 /**
174 * Tracks feature points from one frame (pyramid) to another frame (pyramid).
175 * @param trackingMode The tracking mode to be used, must be valid
176 * @param previousFramePyramid The frame pyramid of the previous frame, must be valid
177 * @param currentFramePyramid The frame pyramid of the current frame, must be valid
178 * @param previousImagePoints The image points located in the previous frame which will be tracked to the current frame, at least one point
179 * @param currentImagePoints The resulting image points located in the current image, one for each previous image points
180 * @param validIndices The indices of all point correspondences that could be tracked reliably (all other correspondences are invalid)
181 * @param worker Optional worker object to distribute the computation
182 * @return True, if succeeded
183 */
184 static bool trackFeaturePoints(const TrackingMode trackingMode, const CV::FramePyramid& previousFramePyramid, const CV::FramePyramid& currentFramePyramid, Vectors2& previousImagePoints, Vectors2& currentImagePoints, Indices32& validIndices, Worker* worker);
185
186 protected:
187
188 /// The tracking mode to be used.
189 TrackingMode trackingMode_ = TM_ZM_SSD_7;
190
191 /// The database storing the object points (feature points) and their corresponding image points.
193
194 /// The frame pyramid of the previous frame.
196
197 /// The frame pyramid of the current frame.
199
200 /// The index of the previous frame.
201 Index32 previousFrameIndex_ = invalidFrameIndex;
202
203 /// Threshold for strengths of feature points, with range [1, 255]
204 unsigned int featurePointStrengthThreshold_ = 15u;
205
206 /// The size of each bin (edge length) in pixel controlling whether new feature points will be added in an empty region.
207 unsigned int binSize_ = 40u;
208
209 /// The lock for this tracker.
210 mutable Lock lock_;
211};
212
213inline void PointTracker::setTrackingMode(const TrackingMode trackingMode)
214{
215 const ScopedLock scopedLock(lock_);
216
218}
219
221{
222 const ScopedLock scopedLock(lock_);
223
224 return trackingMode_;
225}
226
228{
229 const ScopedLock scopedLock(lock_);
230
231 database_.clear<false>();
232
236}
237
239{
240 return database_;
241}
242
243}
244
245}
246
247}
248
249#endif // META_OCEAN_TRACKING_POINT_POINT_TRACKER_H
This class implements a frame pyramid.
Definition FramePyramid.h:37
void clear()
Releases the internal frame layers.
Definition FramePyramid.h:845
This class implements Ocean's image class.
Definition Frame.h:1808
This class implements an occupancy array.
Definition SpatialDistribution.h:370
This class implements a recursive lock object.
Definition Lock.h:31
This class implements a scoped lock object for recursive lock objects.
Definition Lock.h:135
This class implements a database for 3D object points, 2D image points and 6DOF camera poses.
Definition Database.h:67
void clear()
Clears the database including all camera poses, object points, image points and any topology.
Definition Database.h:4877
This class implements a point tracker able to track points between concurrent frames and stores previ...
Definition PointTracker.h:44
PointTracker & operator=(const PointTracker &pointTracker)
Assign operator.
Database database_
The database storing the object points (feature points) and their corresponding image points.
Definition PointTracker.h:192
Lock lock_
The lock for this tracker.
Definition PointTracker.h:210
PointTracker(const PointTracker &pointTracker)
Copy constructor.
static constexpr Index32 invalidFrameIndex
Definition of an invalid frame index.
Definition PointTracker.h:50
TrackingMode trackingMode() const
Returns the current tracking mode.
Definition PointTracker.h:220
Index32 newFrame(const Frame &yFrame, Worker *worker=nullptr)
Tracks object points (feature points) in a new frame.
void clear()
Clears the database containing the object points and their corresponding image points.
Definition PointTracker.h:227
CV::FramePyramid currentFramePyramid_
The frame pyramid of the current frame.
Definition PointTracker.h:198
PointTracker & operator=(PointTracker &&pointTracker) noexcept
Move operator.
void clearUpTo(const unsigned int frameIndex)
Removes all entries from the tracking database older than a specified frame index.
void detectNewFeaturePoints(const Frame &yFrame, Geometry::SpatialDistribution::OccupancyArray &occupancyArray, Vectors2 &newFeaturePoints, Worker *worker=nullptr)
Detects new feature points in empty regions of the provided frame.
void setTrackingMode(const TrackingMode trackingMode)
Sets or changes the tracking mode.
Definition PointTracker.h:213
Database & database()
Returns the internal database storing the topology of the tracked points.
Definition PointTracker.h:238
Index32 previousFrameIndex_
The index of the previous frame.
Definition PointTracker.h:201
PointTracker(PointTracker &&pointTracker) noexcept
Move constructor.
PointTracks pointTracks(const Index32 imageIndex, const unsigned int maximalLength=(unsigned int)(-1))
Returns the point tracks for all object points.
TrackingMode trackingMode_
The tracking mode to be used.
Definition PointTracker.h:189
PointTracker()
Creates a new point tracker.
std::vector< Vectors2 > PointTracks
Definition of a vector holding 2D vectors.
Definition PointTracker.h:55
TrackingMode
Definition of individual tracking modes.
Definition PointTracker.h:61
@ TM_ZM_SSD_15
Zero-mean sum square differences tracking with 15 pixel image patch.
Definition PointTracker.h:72
@ TM_SSD_7
Sum square differences tracking with 7 pixel image patch.
Definition PointTracker.h:63
@ TM_SSD_15
Sum square differences tracking with 15 pixel image patch.
Definition PointTracker.h:65
@ TM_ZM_SSD_7
Zero-mean sum square differences tracking with 7 pixel image patch.
Definition PointTracker.h:70
@ TM_SSD_31
Sum square differences tracking with 31 pixel image patch.
Definition PointTracker.h:67
@ TM_ZM_SSD_31
Zero-mean sum square differences tracking with 31 pixel image patch.
Definition PointTracker.h:74
static bool trackFeaturePoints(const TrackingMode trackingMode, const CV::FramePyramid &previousFramePyramid, const CV::FramePyramid &currentFramePyramid, Vectors2 &previousImagePoints, Vectors2 &currentImagePoints, Indices32 &validIndices, Worker *worker)
Tracks feature points from one frame (pyramid) to another frame (pyramid).
CV::FramePyramid previousFramePyramid_
The frame pyramid of the previous frame.
Definition PointTracker.h:195
This class implements a worker able to distribute function calls over different threads.
Definition Worker.h:33
std::vector< Index32 > Indices32
Definition of a vector holding 32 bit index values.
Definition Base.h:96
uint32_t Index32
Definition of a 32 bit index value.
Definition Base.h:84
std::vector< Vector2 > Vectors2
Definition of a vector holding Vector2 objects.
Definition Vector2.h:64
The namespace covering the entire Ocean framework.
Definition Accessor.h:15