diff options
| -rw-r--r-- | tracker-pt/ftnoir_tracker_pt_dialog.cpp | 5 | ||||
| -rw-r--r-- | tracker-pt/point_extractor.cpp | 2 | ||||
| -rw-r--r-- | tracker-pt/point_tracker.cpp | 54 | ||||
| -rw-r--r-- | tracker-pt/point_tracker.h | 7 | 
4 files changed, 36 insertions, 32 deletions
| diff --git a/tracker-pt/ftnoir_tracker_pt_dialog.cpp b/tracker-pt/ftnoir_tracker_pt_dialog.cpp index d3d68efc..a5108ec1 100644 --- a/tracker-pt/ftnoir_tracker_pt_dialog.cpp +++ b/tracker-pt/ftnoir_tracker_pt_dialog.cpp @@ -10,10 +10,7 @@  #include "cv/video-property-page.hpp"  #include "compat/camera-names.hpp" -#include <opencv2/core/core.hpp> -#include <memory> -#include <vector> -#include <QMessageBox> +#include <opencv2/core.hpp>  #include <QString>  #include <QDebug> diff --git a/tracker-pt/point_extractor.cpp b/tracker-pt/point_extractor.cpp index 48816780..7cd46fe2 100644 --- a/tracker-pt/point_extractor.cpp +++ b/tracker-pt/point_extractor.cpp @@ -69,7 +69,7 @@ void PointExtractor::extract_points(cv::Mat& frame, std::vector<vec2>& points)          const double radius = max(0., (max_radius-min_radius) * s.threshold / 256);          const int area = int(round(3 * M_PI * (min_radius + radius)*(min_radius+radius)));          auto ptr = reinterpret_cast<const float*>(hist.ptr(0)); -        for (int i = sz-1; i > 0; i--) +        for (int i = sz-1; i > 1; i--)          {              cnt += ptr[i];              if (cnt >= area) diff --git a/tracker-pt/point_tracker.cpp b/tracker-pt/point_tracker.cpp index 7873a010..d2071556 100644 --- a/tracker-pt/point_tracker.cpp +++ b/tracker-pt/point_tracker.cpp @@ -15,6 +15,7 @@ using namespace pt_types;  #include <vector>  #include <algorithm>  #include <cmath> +#include <iterator>  #include <QDebug> @@ -67,17 +68,17 @@ void PointModel::set_model(settings_pt& s)      }  } -void PointModel::get_d_order(const std::vector<vec2>& points, int* d_order, const vec2& d) const +void PointModel::get_d_order(const vec2* points, unsigned* d_order, const vec2& d) const  {      // fit line to orthographically projected points -    using t = std::pair<f,int>; -    std::vector<t> d_vals; +    using t = std::pair<f,unsigned>; +    t d_vals[3];      // get sort indices with respect to d scalar product      for (unsigned i = 0; i < PointModel::N_POINTS; ++i) -        d_vals.push_back(std::pair<f, int>(d.dot(points[i]), i)); +        d_vals[i] = t(d.dot(points[i]), i); -    std::sort(d_vals.begin(), -              d_vals.end(), +    std::sort(d_vals, +              d_vals + 3u,                [](const t& a, const t& b) { return a.first < b.first; });      for (unsigned i = 0; i < PointModel::N_POINTS; ++i) @@ -89,7 +90,7 @@ PointTracker::PointTracker() : init_phase(true)  {  } -PointTracker::PointOrder PointTracker::find_correspondences_previous(const std::vector<vec2>& points, +PointTracker::PointOrder PointTracker::find_correspondences_previous(const vec2* points,                                                                       const PointModel& model,                                                                       f focal_length,                                                                       int w, @@ -157,33 +158,33 @@ void PointTracker::track(const std::vector<vec2>& points,      }      if (!dynamic_pose || init_phase) -        order = find_correspondences(points, model); +        order = find_correspondences(points.data(), model);      else +        order = find_correspondences_previous(points.data(), model, focal_length, w, h); + +    if (POSIT(model, order, focal_length) != -1)      { -        order = find_correspondences_previous(points, model, focal_length, w, h); +        init_phase = false; +        t.start();      } - -    POSIT(model, order, focal_length); -    init_phase = false; -    t.start();  } -PointTracker::PointOrder PointTracker::find_correspondences(const std::vector<vec2>& points, const PointModel& model) +PointTracker::PointOrder PointTracker::find_correspondences(const vec2* points, const PointModel& model)  { +    static const Affine a(mat33::eye(), vec3(0, 0, 1));      // We do a simple freetrack-like sorting in the init phase... +    unsigned point_d_order[PointModel::N_POINTS]; +    unsigned model_d_order[PointModel::N_POINTS];      // sort points -    int point_d_order[PointModel::N_POINTS]; -    int model_d_order[PointModel::N_POINTS];      vec2 d(model.M01[0]-model.M02[0], model.M01[1]-model.M02[1]);      model.get_d_order(points, point_d_order, d);      // calculate d and d_order for simple freetrack-like point correspondence -    model.get_d_order(std::vector<vec2> { -                          vec2{0,0}, -                          vec2(model.M01[0], model.M01[1]), -                          vec2(model.M02[0], model.M02[1]) -                      }, -                      model_d_order, -                      d); +    vec2 pts[3] = { +        vec2(0, 0), +        vec2(model.M01[0], model.M01[1]), +        vec2(model.M02[0], model.M02[1]) +    }; +    model.get_d_order(pts, model_d_order, d);      // set correspondences      PointOrder p;      for (unsigned i = 0; i < PointModel::N_POINTS; ++i) @@ -200,7 +201,7 @@ int PointTracker::POSIT(const PointModel& model, const PointOrder& order, f foca      // The expected rotation used for resolving the ambiguity in POSIT:      // In every iteration step the rotation closer to R_expected is taken -    mat33 R_expected = mat33::eye(); +    static const mat33 R_expected(mat33::eye());      // initial pose = last (predicted) pose      vec3 k; @@ -345,6 +346,11 @@ int PointTracker::POSIT(const PointModel& model, const PointOrder& order, f foca  vec2 PointTracker::project(const vec3& v_M, f focal_length)  { +    return project(v_M, focal_length, X_CM); +} + +vec2 PointTracker::project(const vec3& v_M, f focal_length, const Affine& X_CM) +{      vec3 v_C = X_CM * v_M;      return vec2(focal_length*v_C[0]/v_C[2], focal_length*v_C[1]/v_C[2]);  } diff --git a/tracker-pt/point_tracker.h b/tracker-pt/point_tracker.h index 5576b41b..9530c338 100644 --- a/tracker-pt/point_tracker.h +++ b/tracker-pt/point_tracker.h @@ -70,7 +70,7 @@ public:      PointModel(settings_pt& s);      void set_model(settings_pt& s); -    void get_d_order(const std::vector<vec2>& points, int* d_order, const vec2& d) const; +    void get_d_order(const vec2* points, unsigned* d_order, const vec2& d) const;  };  // ---------------------------------------------------------------------------- @@ -87,13 +87,14 @@ public:      void track(const std::vector<vec2>& projected_points, const PointModel& model, f focal_length, bool dynamic_pose, int init_phase_timeout, int w, int h);      Affine pose() { return X_CM; }      vec2 project(const vec3& v_M, f focal_length); +    vec2 project(const vec3& v_M, f focal_length, const Affine& X_CM);  private:      // the points in model order      using PointOrder = std::array<vec2, 3>; -    PointOrder find_correspondences(const std::vector<vec2>& projected_points, const PointModel &model); -    PointOrder find_correspondences_previous(const std::vector<vec2>& points, const PointModel &model, f focal_length, int w, int h); +    PointOrder find_correspondences(const vec2* projected_points, const PointModel &model); +    PointOrder find_correspondences_previous(const vec2* points, const PointModel &model, f focal_length, int w, int h);      int POSIT(const PointModel& point_model, const PointOrder& order, f focal_length);  // The POSIT algorithm, returns the number of iterations      Affine X_CM; // trafo from model to camera | 
