changeset 481:b6ad86ee7033

implemented smoothing (requires latest trajectory management library version)
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Wed, 02 Apr 2014 01:45:53 -0400
parents f43bc0b0ba74
children f6415f012640
files c/Motion.cpp c/feature-based-tracking.cpp c/test_feature.cpp include/Motion.hpp include/cvutils.hpp
diffstat 5 files changed, 45 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/c/Motion.cpp	Tue Apr 01 17:42:40 2014 -0400
+++ b/c/Motion.cpp	Wed Apr 02 01:45:53 2014 -0400
@@ -66,7 +66,7 @@
     else
       ratio = displacementDistances[nPositions-3] / displacementDistances[nPositions-2];
 
-    float cosine = scalarProduct((*velocities)[nPositions-3],(*velocities)[nPositions-2]) / (displacementDistances[nPositions-3] * displacementDistances[nPositions-2]);
+    float cosine = (*velocities)[nPositions-3].dot((*velocities)[nPositions-2]) / (displacementDistances[nPositions-3] * displacementDistances[nPositions-2]);
     
     result = (ratio < accelerationBound) & (cosine > deviationBound);
   }
@@ -111,6 +111,11 @@
   displacementDistances.pop_back();
 }
 
+void FeatureTrajectory::movingAverage(const unsigned int& nFramesSmoothing) {
+  positions->movingAverage(nFramesSmoothing);
+  velocities->movingAverage(nFramesSmoothing);
+}
+
 void FeatureTrajectory::write(TrajectoryDBAccess<Point2f>& trajectoryDB, const string& positionsTableName, const string& velocitiesTableName) const {
   trajectoryDB.write(*positions, positionsTableName);
   trajectoryDB.write(*velocities, velocitiesTableName);
--- a/c/feature-based-tracking.cpp	Tue Apr 01 17:42:40 2014 -0400
+++ b/c/feature-based-tracking.cpp	Wed Apr 02 01:45:53 2014 -0400
@@ -170,6 +170,7 @@
 	    if (iter->feature->length() >= params.minFeatureTime) {
 	      iter->feature->setId(savedFeatureId);
 	      savedFeatureId++;
+	      iter->feature->movingAverage(params.nFramesSmoothing);
 	      lostFeatures.push_back(iter->feature);
 	    }
 	    iter = featurePointMatches.erase(iter);
@@ -222,7 +223,8 @@
     if (iter->feature->length() >= params.minFeatureTime) {
       iter->feature->setId(savedFeatureId);
       savedFeatureId++;
-      f->write(*trajectoryDB, "positions", "velocities")
+      iter->feature->movingAverage(params.nFramesSmoothing);
+      iter->feature->write(*trajectoryDB, "positions", "velocities");
     }
     iter++;
   }
--- a/c/test_feature.cpp	Tue Apr 01 17:42:40 2014 -0400
+++ b/c/test_feature.cpp	Wed Apr 02 01:45:53 2014 -0400
@@ -10,6 +10,38 @@
 using namespace std;
 using namespace cv;
 
+TEST_CASE("trajectory/smoothing", "test trajectory smoothing (from trajectory management library)") {
+  TrajectoryPoint2f t1;
+  for(int i=0; i<20;++i)
+    t1.add(i, cv::Point2f(1+i, 1+0.5*i));
+
+  TrajectoryPoint2f t2(t1);
+  t2.movingAverage(3);
+  for(int i=0; i<20;++i) 
+    REQUIRE(t1.getPoint(i) == t2.getPoint(i));
+  t1.clear();
+  cv::Point2f p0(1,1);
+  cv::Point2f p1(2,2);
+  cv::Point2f p2(2.4,3);
+  cv::Point2f p3(3.1,3.4);
+  cv::Point2f p4(3.4,4);
+  cv::Point2f p5(3.6,4.5);
+  
+  t1.add(0, p0);
+  t1.add(1, p1);
+  t1.add(2, p2);
+  t1.add(3, p3);
+  t1.add(4, p4);
+  t1.add(5, p5);
+  t1.movingAverage(2);
+  REQUIRE(t1.getPoint(0) == p0);
+  REQUIRE(t1.getPoint(1) == (p0+p1+p2)*(1./3.));
+  REQUIRE(t1.getPoint(2) == (p0+p1+p2+p3+p4)*(1./5.));
+  REQUIRE(t1.getPoint(3) == (p1+p2+p3+p4+p5)*(1./5.));
+  REQUIRE(t1.getPoint(4) == (p3+p4+p5)*(1./3.));
+  REQUIRE(t1.getPoint(5) == p5);
+}
+
 TEST_CASE("features/similarity", "test feature similarity measure") {
   FeatureTrajectoryPtr ft1 = createFeatureTrajectory(1, 10, 20, Point2f(1,1), Point2f(0, 1));
   FeatureTrajectoryPtr ft2 = createFeatureTrajectory(2, 10, 20, Point2f(2,1), Point2f(0, 1));
--- a/include/Motion.hpp	Tue Apr 01 17:42:40 2014 -0400
+++ b/include/Motion.hpp	Wed Apr 02 01:45:53 2014 -0400
@@ -49,6 +49,8 @@
 
   void shorten(void);
 
+  void movingAverage(const unsigned int& nFramesSmoothing);
+
   void write(TrajectoryDBAccess<cv::Point2f>& trajectoryDB, const std::string& positionsTableName, const std::string& velocitiesTableName) const;
 
 #ifdef USE_OPENCV
--- a/include/cvutils.hpp	Tue Apr 01 17:42:40 2014 -0400
+++ b/include/cvutils.hpp	Wed Apr 02 01:45:53 2014 -0400
@@ -17,8 +17,8 @@
 /** Loads a cv mat from a text file where the numbers are saved line by line separated by separator */
 cv::Mat loadMat(const std::string& filename, const std::string& separator);
 
-template<typename T> 
-float scalarProduct(const cv::Point_<T>& v1, const cv::Point_<T>& v2) { return v1.x*v2.x+v1.y*v2.y;}
+//template<typename T> 
+//float scalarProduct(const cv::Point_<T>& v1, const cv::Point_<T>& v2) { return v1.x*v2.x+v1.y*v2.y;}
 
 void keyPoints2Points(const std::vector<cv::KeyPoint>& kpts, std::vector<cv::Point2f>& pts, const bool& clearPts = true);