Libmv: Code cleanup
[blender.git] / extern / libmv / libmv / autotrack / marker.h
1 // Copyright (c) 2014 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 // Author: mierle@gmail.com (Keir Mierle)
22
23 #ifndef LIBMV_AUTOTRACK_MARKER_H_
24 #define LIBMV_AUTOTRACK_MARKER_H_
25
26 #include <ostream>
27
28 #include "libmv/autotrack/quad.h"
29 #include "libmv/autotrack/region.h"
30 #include "libmv/numeric/numeric.h"
31
32 namespace mv {
33
34 using libmv::Vec2f;
35
36 // A marker is the 2D location of a tracked region (quad) in an image.
37 // Note that some of this information could be normalized by having a
38 // collection of inter-connected structs. Instead the "fat Marker" design below
39 // trades memory for data structure simplicity.
40 struct Marker {
41   int clip;   // The clip this marker is from.
42   int frame;  // The frame within the clip this marker is from.
43   int track;  // The track this marker is from.
44
45   // The center of the marker in frame coordinates. This is typically, but not
46   // always, the same as the center of the patch.
47   Vec2f center;
48
49   // A frame-realtive quad defining the part of the image the marker covers.
50   // For reference markers, the pixels in the patch are the tracking pattern.
51   Quad2Df patch;
52
53   // Some markers are less certain than others; the weight determines the
54   // amount this marker contributes to the error. 1.0 indicates normal
55   // contribution; 0.0 indicates a zero-weight track (and will be omitted from
56   // bundle adjustment).
57   float weight;
58
59   enum Source {
60     MANUAL,      // The user placed this marker manually.
61     DETECTED,    // A keypoint detector found this point.
62     TRACKED,     // The tracking algorithm placed this marker.
63     MATCHED,     // A matching algorithm (e.g. SIFT or SURF or ORB) found this.
64     PREDICTED,   // A motion model predicted this marker. This is needed for
65                  // handling occlusions in some cases where an imaginary marker
66                  // is placed to keep camera motion smooth.
67   };
68   Source source;
69
70   // Markers may be inliers or outliers if the tracking fails; this allows
71   // visualizing the markers in the image.
72   enum Status {
73     UNKNOWN,
74     INLIER,
75     OUTLIER
76   };
77   Status status;
78
79   // When doing correlation tracking, where to search in the current frame for
80   // the pattern from the reference frame, in absolute frame coordinates.
81   Region search_region;
82
83   // For tracked and matched markers, indicates what the reference was.
84   int reference_clip;
85   int reference_frame;
86
87   // Model related information for non-point tracks.
88   //
89   // Some tracks are on a larger object, such as a plane or a line or perhaps
90   // another primitive (a rectangular prisim). This captures the information
91   // needed to say that for example a collection of markers belongs to model #2
92   // (and model #2 is a plane).
93   enum ModelType {
94     POINT,
95     PLANE,
96     LINE,
97     CUBE
98   };
99   ModelType model_type;
100
101   // The model ID this track (e.g. the second model, which is a plane).
102   int model_id;
103
104   // TODO(keir): Add a "int model_argument" to capture that e.g. a marker is on
105   // the 3rd face of a cube.
106
107   enum Channel {
108     CHANNEL_R = (1 << 0),
109     CHANNEL_G = (1 << 1),
110     CHANNEL_B = (1 << 2),
111   };
112
113   // Channels from the original frame which this marker is unable to see.
114   int disabled_channels;
115
116   // Offset everything (center, patch, search) by the given delta.
117   template<typename T>
118   void Offset(const T& offset) {
119     center += offset.template cast<float>();
120     patch.coordinates.rowwise() += offset.template cast<int>();
121     search_region.Offset(offset);
122   }
123
124   // Shift the center to the given new position (and patch, search).
125   template<typename T>
126   void SetPosition(const T& new_center) {
127     Offset(new_center - center);
128   }
129 };
130
131 inline std::ostream& operator<<(std::ostream& out, const Marker& marker) {
132   out << "{"
133       << marker.clip << ", "
134       << marker.frame << ", "
135       << marker.track << ", ("
136       << marker.center.x() << ", "
137       << marker.center.y() << ")"
138       << "}";
139   return out;
140 }
141
142 }  // namespace mv
143
144 #endif  // LIBMV_AUTOTRACK_MARKER_H_