f9af3ada45bc4a32ebc252205f84fa672da67800
[blender.git] / extern / libmv / libmv / simple_pipeline / tracks.h
1 // Copyright (c) 2011 libmv authors.
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining a copy
4 // of this software and associated documentation files (the "Software"), to
5 // deal in the Software without restriction, including without limitation the
6 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7 // sell copies of the Software, and to permit persons to whom the Software is
8 // furnished to do so, subject to the following conditions:
9 //
10 // The above copyright notice and this permission notice shall be included in
11 // all copies or substantial portions of the Software.
12 //
13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19 // IN THE SOFTWARE.
20
21 #ifndef LIBMV_SIMPLE_PIPELINE_TRACKS_H_
22 #define LIBMV_SIMPLE_PIPELINE_TRACKS_H_
23
24 #include "libmv/base/vector.h"
25 #include "libmv/numeric/numeric.h"
26
27 namespace libmv {
28
29 /*!
30     A Marker is the 2D location of a tracked point in an image.
31
32     \a x, \a y is the position of the marker in pixels from the top left corner
33     in the image identified by \a image. All markers for to the same target
34     form a track identified by a common \a track number.
35
36     \note Markers are typically aggregated with the help of the \l Tracks class.
37
38     \sa Tracks
39 */
40 struct Marker {
41   int image;
42   int track;
43   double x, y;
44 };
45
46 /*!
47     The Tracks class stores \link Marker reconstruction markers \endlink.
48
49     The Tracks container is intended as the store of correspondences between
50     images, which must get created before any 3D reconstruction can take place.
51
52     The container has several fast lookups for queries typically needed for
53     structure from motion algorithms, such as \l MarkersForTracksInBothImages().
54
55     \sa Marker
56 */
57 class Tracks {
58  public:
59   Tracks() { }
60
61   // Copy constructor for a tracks object.
62   Tracks(const Tracks &other);
63
64   /// Construct a new tracks object using the given markers to start.
65   Tracks(const vector<Marker> &markers);
66
67   /*!
68       Inserts a marker into the set. If there is already a marker for the given
69       \a image and \a track, the existing marker is replaced. If there is no
70       marker for the given \a image and \a track, a new one is added.
71
72       \a image and \a track are the keys used to retrieve the markers with the
73       other methods in this class.
74
75       \note To get an identifier for a new track, use \l MaxTrack() + 1.
76   */
77   void Insert(int image, int track, double x, double y);
78
79   /// Returns all the markers.
80   vector<Marker> AllMarkers() const;
81
82   /// Returns all the markers belonging to a track.
83   vector<Marker> MarkersForTrack(int track) const;
84
85   /// Returns all the markers visible in \a image.
86   vector<Marker> MarkersInImage(int image) const;
87
88   /// Returns all the markers visible in \a image1 and \a image2.
89   vector<Marker> MarkersInBothImages(int image1, int image2) const;
90
91   /*!
92       Returns the markers in \a image1 and \a image2 which have a common track.
93
94       This is not the same as the union of the markers in \a image1 and \a
95       image2; each marker is for a track that appears in both images.
96   */
97   vector<Marker> MarkersForTracksInBothImages(int image1, int image2) const;
98
99   /// Returns the marker in \a image belonging to \a track.
100   Marker MarkerInImageForTrack(int image, int track) const;
101
102   /// Removes all the markers belonging to \a track.
103   void RemoveMarkersForTrack(int track);
104
105   /// Removes the marker in \a image belonging to \a track.
106   void RemoveMarker(int image, int track);
107
108   /// Returns the maximum image identifier used.
109   int MaxImage() const;
110
111   /// Returns the maximum track identifier used.
112   int MaxTrack() const;
113
114   /// Returns the number of markers.
115   int NumMarkers() const;
116
117  private:
118   vector<Marker> markers_;
119 };
120
121 void CoordinatesForMarkersInImage(const vector<Marker> &markers,
122                                   int image,
123                                   Mat *coordinates);
124
125 }  // namespace libmv
126
127 #endif  // LIBMV_SIMPLE_PIPELINE_MARKERS_H_