Mercurial Hosting > traffic-intelligence
diff c/Motion.cpp @ 139:47329bd16cc0
cleaned code, added condition on smooth displacement
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Tue, 23 Aug 2011 13:14:47 -0400 |
parents | c1b260b48d2a |
children | a3532db00c28 |
line wrap: on
line diff
--- a/c/Motion.cpp Fri Aug 19 12:15:23 2011 -0400 +++ b/c/Motion.cpp Tue Aug 23 13:14:47 2011 -0400 @@ -1,4 +1,5 @@ #include "Motion.hpp" +#include "cvutils.hpp" #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" @@ -24,9 +25,28 @@ return result; } +bool FeatureTrajectory::motionSmooth(const int& accelerationBound, const int& deviationBound) const { + bool result = true; + unsigned int nPositions = positions.size(); + if (nPositions >= 3) { + float ratio; + if (displacementDistances[nPositions-2] > displacementDistances[nPositions-3]) + ratio = displacementDistances[nPositions-2] / displacementDistances[nPositions-3]; + else + ratio = displacementDistances[nPositions-3] / displacementDistances[nPositions-2]; + + float cosine = scalarProduct(velocities[nPositions-3],velocities[nPositions-2]) / (displacementDistances[nPositions-3] * displacementDistances[nPositions-2]); + + result &= (ratio < accelerationBound) & (cosine > deviationBound); + } + return result; +} + void FeatureTrajectory::addPoint(const int& frameNum, const Point2f& p) { positions.add(frameNum, p); computeMotionData(frameNum); + assert(positions.size() == displacementDistances.size()+1); + assert(positions.size() == velocities.size()+1); } void FeatureTrajectory::shorten(void) { @@ -56,10 +76,10 @@ void FeatureTrajectory::computeMotionData(const int& frameNum) { unsigned int nPositions = positions.size(); - if (nPositions >= 3) { + if (nPositions >= 2) { 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); + //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);