From 2ba54cd3841d41fb3838a3910941c763586414af Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Fri, 28 Nov 2014 23:03:04 +0100 Subject: pt: use 3D coordinates for distinguishing points Issue: #98 --- ftnoir_tracker_pt/point_tracker.cpp | 22 +++++++++++----------- ftnoir_tracker_pt/point_tracker.h | 5 ++++- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/ftnoir_tracker_pt/point_tracker.cpp b/ftnoir_tracker_pt/point_tracker.cpp index afb348c6..640d4528 100644 --- a/ftnoir_tracker_pt/point_tracker.cpp +++ b/ftnoir_tracker_pt/point_tracker.cpp @@ -6,6 +6,7 @@ */ #include "point_tracker.h" +#include #include #include @@ -50,8 +51,11 @@ PointModel::PointModel(Vec3f M01, Vec3f M02) float s11 = M01.dot(M01); float s12 = M01.dot(M02); float s22 = M02.dot(M02); - P = 1.0/(s11*s22-s12*s12) * Matx22f(s22, -s12, - -s12, s11); + P = 1.0/(s11*s22-s12*s12) * Matx22f(s22, -s12, -s12, s11); + + cv::Vec6f line; + cv::fitLine(std::vector{M01, M02}, line, CV_DIST_L1, 0, 1e-2, 1e-4); + d = cv::Vec3f(line[0], line[1], line[3]); } #ifdef OPENTRACK_API @@ -61,12 +65,12 @@ static bool d_vals_sort(const pair a, const pair b) } #endif -void PointModel::get_d_order(const std::vector& points, int d_order[]) const +template +void PointModel::get_d_order(const std::vector& points, int d_order[], vec d) const { // fit line to orthographically projected points - Vec2f d(M01[0]-M02[0], M01[1]-M02[1]); - // get sort indices with respect to d scalar product vector< pair > d_vals; + // get sort indices with respect to d scalar product for (unsigned i = 0; i(d.dot(points[i]), i)); @@ -102,13 +106,9 @@ PointTracker::PointOrder PointTracker::find_correspondences(const std::vector model_points; - model_points.push_back(Vec2f(0,0)); - model_points.push_back(Vec2f(model.M01[0], model.M01[1])); - model_points.push_back(Vec2f(model.M02[0], model.M02[1])); - model.get_d_order(model_points, model_d_order); + model.get_d_order(std::vector{ Vec3f{0,0,0}, model.M01, model.M02 }, model_d_order, model.d); // set correspondences PointOrder p; for (int i=0; i& points, int* d_order) const; + cv::Vec3f d; + + template + void get_d_order(const std::vector& points, int* d_order, vec d) const; }; // ---------------------------------------------------------------------------- -- cgit v1.2.3