Mercurial Hosting > traffic-intelligence
changeset 135:32d2722d4028
added constraint on minimum displacement
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Thu, 18 Aug 2011 01:03:38 -0400 |
parents | a617d0808bbc |
children | 0f790de9437e |
files | c/Feature.cpp c/feature-based-tracking.cpp include/Feature.hpp include/Parameters.hpp |
diffstat | 4 files changed, 40 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/c/Feature.cpp Wed Aug 17 23:21:26 2011 -0400 +++ b/c/Feature.cpp Thu Aug 18 01:03:38 2011 -0400 @@ -12,6 +12,18 @@ addPoint(frameNum, p); } +bool FeatureTrajectory::largeDisplacement(const int& nDisplacements, const float& minTotalFeatureDisplacement) const { + bool result = true; + unsigned int nPositions = positions.size(); + if (nPositions > nDisplacements) { + float disp = 0; + for (int i=0; i<nDisplacements; i++) + disp += displacementDistances[nPositions-2-i]; + result = disp > minTotalFeatureDisplacement; + } + return result; +} + void FeatureTrajectory::addPoint(const int& frameNum, const Point2f& p) { positions.add(frameNum, p); computeMotionData(frameNum); @@ -40,15 +52,10 @@ unsigned int nPositions = positions.size(); if (nPositions >= 3) { Point2f displacement = positions[nPositions-1] - positions[nPositions-2]; + if (nPositions == 2) // duplicate first displacement so that positions and velocities have the same length + velocities.add(frameNum-1, displacement); velocities.add(frameNum, displacement); float dist = norm(displacement); displacementDistances.push_back(dist); - } else if (nPositions == 2) { - Point2f displacement = positions[1] - positions[0]; - velocities.add(frameNum-1, displacement); - velocities.add(frameNum, displacement); - float dist = norm(displacement); - displacementDistances.push_back(dist); - displacementDistances.push_back(dist); } }
--- a/c/feature-based-tracking.cpp Wed Aug 17 23:21:26 2011 -0400 +++ b/c/feature-based-tracking.cpp Thu Aug 18 01:03:38 2011 -0400 @@ -60,7 +60,7 @@ Mat frame, currentFrameBW, previousFrameBW; KLTFeatureTrackingParameters params; - params.display = false; + params.display = true; params.frame1 = 0; params.nFrames = -1; params.maxNFeatures = 1000; @@ -72,6 +72,10 @@ //GoodFeaturesToTrackDetector detector(params.maxNFeatures, params.featureQuality, params.minFeatureDistanceKLT, params.windowSize, params.useHarrisDetector, params.k); params.pyramidLevel = 3; + params.nDisplacements = 3; + params.minFeatureDisplacement = 0.05; + float minTotalFeatureDisplacement = params.nDisplacements*params.minFeatureDisplacement; + params.maxNumberTrackingIterations = 20; // 30 params.minTrackingError = 0.3; // 0.01 params.derivLambda = 0.5; @@ -148,19 +152,26 @@ vector<Point2f> trackedPts; vector<FeaturePointMatch>::iterator iter = featurePointMatches.begin(); while (iter != featurePointMatches.end()) { + bool deleteFeature = false; + if (status[iter->pointNum]) { iter->feature->addPoint(frameNum, currPts[iter->pointNum]); trackedPts.push_back(currPts[iter->pointNum]); iter->pointNum = trackedPts.size()-1; - iter++; - } else { + + deleteFeature |= !iter->feature->largeDisplacement(params.nDisplacements, minTotalFeatureDisplacement); + // motionSmooth() + } + + if (deleteFeature) { if (iter->feature->length() >= params.minFeatureTime) { iter->feature->setId(savedFeatureId); savedFeatureId++; iter->feature->write(trajectoryDB); } iter = featurePointMatches.erase(iter); - } + } else + iter++; } currPts = trackedPts; assert(currPts.size() == featurePointMatches.size());
--- a/include/Feature.hpp Wed Aug 17 23:21:26 2011 -0400 +++ b/include/Feature.hpp Thu Aug 18 01:03:38 2011 -0400 @@ -18,6 +18,11 @@ void setId(const unsigned int& id) { positions.setId(id);velocities.setId(id);} + /// indicates whether the sum of the last nDisplacements displacements have been superior to minFeatureDisplacement + bool largeDisplacement(const int& nDisplacements, const float& minTotalFeatureDisplacement) const; + + //void shorten(void); + void addPoint(const int& frameNum, const cv::Point2f& p); void write(TrajectoryDBAccess<cv::Point2f>& trajectoryDB) const; @@ -38,4 +43,7 @@ typedef boost::shared_ptr<FeatureTrajectory> FeatureTrajectoryPtr; +// class MovingObject {} +// roadUserType, group of features + #endif
--- a/include/Parameters.hpp Wed Aug 17 23:21:26 2011 -0400 +++ b/include/Parameters.hpp Thu Aug 18 01:03:38 2011 -0400 @@ -23,7 +23,7 @@ bool useHarrisDetector; float k; int pyramidLevel; - int nFramesDisplacement; + int nDisplacements; float minFeatureDisplacement; float accelerationBound; float deviationBound; @@ -32,7 +32,7 @@ int maxNumberTrackingIterations; float minTrackingError; float derivLambda; - int minFeatureTime; + unsigned int minFeatureTime; float mmConnectionDistance; float mmSegmentationDistance; float maxDistance; @@ -41,7 +41,7 @@ //KLTFeatureTrackingParameters(const int argc, char* argv[]); - //KLTFeatureTrackingParameters(bool loadFeatures, std::string videoFilename, int videoFPS, int measurementPrecision, int frame1, int nFrames, int maxNFeatures, float featureQuality, float minFeatureDistanceKLT, int windowSize, int pyramidLevel, int nFramesDisplacement, float minFeatureDisplacement, float accelerationBound, float deviationBound, int nFramesSmoothing, int nFramesVelocity, int maxNumberTrackingIterations, float minTrackingError, int minFeatureTime, float mmConnectionDistance, float mmSegmentationDistance, float maxDistance, float minVelocityCosine, int minNFeaturesPerGroup); + //KLTFeatureTrackingParameters(bool loadFeatures, std::string videoFilename, int videoFPS, int measurementPrecision, int frame1, int nFrames, int maxNFeatures, float featureQuality, float minFeatureDistanceKLT, int windowSize, int pyramidLevel, int nDisplacements, float minFeatureDisplacement, float accelerationBound, float deviationBound, int nFramesSmoothing, int nFramesVelocity, int maxNumberTrackingIterations, float minTrackingError, int minFeatureTime, float mmConnectionDistance, float mmSegmentationDistance, float maxDistance, float minVelocityCosine, int minNFeaturesPerGroup); };