136 const PredictDirection predict_direction = getPredictDirection(track_options);
137 bool predicted_position =
false;
139 LG <<
"Successfully predicted!";
140 predicted_position =
true;
142 LG <<
"Prediction failed; trying to track anyway.";
148 tracked_marker->
track,
153 MarkerToArrays(reference_marker, x1, y1);
156 MarkerToArrays(*tracked_marker, x2, y2);
160 FloatImage reference_image;
162 GetImageForMarker(reference_marker, frame_accessor_, &reference_image);
163 if (!reference_key) {
164 LG <<
"Couldn't get frame for reference marker: " << reference_marker;
168 FloatImage reference_mask;
170 GetMaskForMarker(reference_marker, frame_accessor_, &reference_mask);
172 FloatImage tracked_image;
174 GetImageForMarker(*tracked_marker, frame_accessor_, &tracked_image);
177 LG <<
"Couldn't get frame for tracked marker: " << tracked_marker;
182 Vec2f original_center = tracked_marker->
center;
187 local_track_region_options = *track_options;
189 if (reference_mask_key !=
NULL) {
190 LG <<
"Using mask for reference marker: " << reference_marker;
191 local_track_region_options.
image1_mask = &reference_mask;
195 TrackRegion(reference_image,
199 local_track_region_options,
206 for (
int i = 0; i < 4; ++i) {
210 tracked_marker->
center(0) = x2[4] + tracked_origin[0];
211 tracked_marker->
center(1) = y2[4] + tracked_origin[1];
212 Vec2f delta = tracked_marker->
center - original_center;
246 int num_clips = frame_accessor_->
NumClips();
247 for (
int clip = 0; clip < num_clips; ++clip) {
248 int num_frames = frame_accessor_->
NumFrames(clip);
249 vector<Marker> previous_frame_markers;
254 for (
int frame = 0; frame < num_frames; ++frame) {
256 LG <<
"Got cancel message while detecting and tracking...";
260 vector<Marker> this_frame_markers;
262 LG <<
"Clip " << clip <<
", frame " << frame <<
" have "
263 << this_frame_markers.size();
264 if (this_frame_markers.size() <
options.min_num_features) {
266 this_frame_markers.clear();
268 LG <<
"... detected " << this_frame_markers.size() <<
" features.";
270 if (previous_frame_markers.empty()) {
271 LG <<
"First frame; skipping tracking stage.";
272 previous_frame_markers.swap(this_frame_markers);
278 vector<int> tracks_in_this_frame;
279 for (
int i = 0; i < this_frame_markers.size(); ++i) {
280 tracks_in_this_frame.push_back(this_frame_markers[i].track);
282 std::sort(tracks_in_this_frame.begin(), tracks_in_this_frame.end());
285 vector<Marker*> previous_frame_markers_to_track;
286 for (
int i = 0; i < previous_frame_markers.size(); ++i) {
287 if (std::binary_search(tracks_in_this_frame.begin(),
288 tracks_in_this_frame.end(),
289 previous_frame_markers[i].track)) {
292 previous_frame_markers_to_track.push_back(&previous_frame_markers[i]);
297 for (
int i = 0; i < previous_frame_markers_to_track.size(); ++i) {
298 Marker this_frame_marker = *previous_frame_markers_to_track[i];
299 this_frame_marker.
frame = frame;
300 LG <<
"Tracking: " << this_frame_marker;
303 if (result.is_usable()) {
304 LG <<
"Success: " << this_frame_marker;
306 this_frame_markers.push_back(this_frame_marker);
308 LG <<
"Failed to track: " << this_frame_marker;
312 previous_frame_markers.swap(this_frame_markers);