Mercurial Hosting > traffic-intelligence
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);