diff options
-rw-r--r-- | tracker-pt/point_tracker.cpp | 71 |
1 files changed, 47 insertions, 24 deletions
diff --git a/tracker-pt/point_tracker.cpp b/tracker-pt/point_tracker.cpp index 636a253d..b04c8eb1 100644 --- a/tracker-pt/point_tracker.cpp +++ b/tracker-pt/point_tracker.cpp @@ -142,6 +142,8 @@ bool PointTracker::maybe_use_old_pose(const PointOrder& order, const pt_camera_i const f cx = std_width / info.res_x; const f cy = std_height / info.res_y; + bool validp = false; + for (unsigned k = 0; k < 3; k++) { // note, the .y component is actually scaled by width @@ -149,25 +151,46 @@ bool PointTracker::maybe_use_old_pose(const PointOrder& order, const pt_camera_i scaled_order[k][1] = std_width * cy * order[k][1]; } - f sum = 0; - - for (unsigned k = 0; k < 3; k++) + if (prev_positions_valid) { - vec2 tmp = prev_scaled_order[k] - scaled_order[k]; - sum += std::sqrt(tmp.dot(tmp)); - } + f sum = 0; - // CAVEAT don't increase too much, it visibly loses precision - constexpr f max_dist = f(.13); + for (unsigned k = 0; k < 3; k++) + { + vec2 tmp = prev_positions[k] - scaled_order[k]; + sum += std::sqrt(tmp.dot(tmp)); + } - const bool validp = sum < max_dist; + // CAVEAT don't increase too much, it visibly loses precision + constexpr f max_dist = f(.04 * PointModel::N_POINTS); - prev_order_valid &= validp; + // whether previous positions fit current data + validp = sum < max_dist; + } - if (!prev_order_valid) + // positions are valid as long as the points barely moved + // (1) old positions is invalid according to new data + // - establish new positions but return `false' so that + // the next iteration tries it prior to running POSIT + // - if we returned `true', the identity pose would + // get returned forever + // (2) old positions were and still are valid + // - reuse the old pose, but don't overwrite the positions + // - if they were overwritten, we'd get slow movements + // resulting in no new pose being computed at all + // - we return `true' so that POSIT isn't invoked + // (3) old positions were marked invalid from the start + // - only possible if POSIT returns any NaN value, + // tracking just got started, or center is requested + // - proceed as in (1) + + if (!validp) { - prev_order = order; - prev_scaled_order = scaled_order; + // if last order doesn't fit, establish a new one based on + // the pose that's just about the be computed, but + // return false so we don't reuse the same identity pose (d'oh) + prev_positions = scaled_order; + prev_positions_valid = true; } #if 0 @@ -179,7 +202,7 @@ bool PointTracker::maybe_use_old_pose(const PointOrder& order, const pt_camera_i tt.start(); if (cnt1 + cnt2) { - qDebug() << "old-order" << ((cnt1 * 100) / f(cnt1 + cnt2)) << "nsamples" << (cnt1 + cnt2); + qDebug() << "old-order" << ((cnt1 * 100.) / (cnt1 + cnt2)) << "nsamples" << (cnt1 + cnt2); cnt1 = 0; cnt2 = 0; } } @@ -190,8 +213,7 @@ bool PointTracker::maybe_use_old_pose(const PointOrder& order, const pt_camera_i } #endif - prev_order_valid = validp; - + // whether previous *and* current pose have valid positions return validp; } @@ -203,23 +225,24 @@ void PointTracker::track(const std::vector<vec2>& points, const double fx = pt_camera_info::get_focal_length(info.fov, info.res_x, info.res_y); PointOrder order; - if (init_phase_timeout > 0 && t.elapsed_ms() > init_phase_timeout) + if (init_phase_timeout <= 0 || init_phase || t.elapsed_ms() > init_phase_timeout) { - t.start(); init_phase = true; - } - - if (!(init_phase_timeout > 0 && !init_phase)) order = find_correspondences(points.data(), model); + } else + { + t.start(); order = find_correspondences_previous(points.data(), model, info); + } - if (maybe_use_old_point_order(order, info) || - POSIT(model, order, fx) != -1) + if (maybe_use_old_pose(order, info) || POSIT(model, order, fx) != -1) { init_phase = false; t.start(); } + else + reset_state(); } PointTracker::PointOrder PointTracker::find_correspondences(const vec2* points, const PointModel& model) @@ -418,7 +441,7 @@ vec2 PointTracker::project(const vec3& v_M, f focal_length, const Affine& X_CM) void PointTracker::reset_state() { - prev_order_valid = false; + prev_positions_valid = false; init_phase = true; } |