comparison 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
comparison
equal deleted inserted replaced
138:c1b260b48d2a 139:47329bd16cc0
1 #include "Motion.hpp" 1 #include "Motion.hpp"
2 #include "cvutils.hpp"
2 3
3 #include "opencv2/core/core.hpp" 4 #include "opencv2/core/core.hpp"
4 #include "opencv2/highgui/highgui.hpp" 5 #include "opencv2/highgui/highgui.hpp"
5 6
6 #include "src/TrajectoryDBAccessList.h" 7 #include "src/TrajectoryDBAccessList.h"
22 result = disp < minTotalFeatureDisplacement; 23 result = disp < minTotalFeatureDisplacement;
23 } 24 }
24 return result; 25 return result;
25 } 26 }
26 27
28 bool FeatureTrajectory::motionSmooth(const int& accelerationBound, const int& deviationBound) const {
29 bool result = true;
30 unsigned int nPositions = positions.size();
31 if (nPositions >= 3) {
32 float ratio;
33 if (displacementDistances[nPositions-2] > displacementDistances[nPositions-3])
34 ratio = displacementDistances[nPositions-2] / displacementDistances[nPositions-3];
35 else
36 ratio = displacementDistances[nPositions-3] / displacementDistances[nPositions-2];
37
38 float cosine = scalarProduct(velocities[nPositions-3],velocities[nPositions-2]) / (displacementDistances[nPositions-3] * displacementDistances[nPositions-2]);
39
40 result &= (ratio < accelerationBound) & (cosine > deviationBound);
41 }
42 return result;
43 }
44
27 void FeatureTrajectory::addPoint(const int& frameNum, const Point2f& p) { 45 void FeatureTrajectory::addPoint(const int& frameNum, const Point2f& p) {
28 positions.add(frameNum, p); 46 positions.add(frameNum, p);
29 computeMotionData(frameNum); 47 computeMotionData(frameNum);
48 assert(positions.size() == displacementDistances.size()+1);
49 assert(positions.size() == velocities.size()+1);
30 } 50 }
31 51
32 void FeatureTrajectory::shorten(void) { 52 void FeatureTrajectory::shorten(void) {
33 positions.pop_back(); 53 positions.pop_back();
34 velocities.pop_back(); 54 velocities.pop_back();
54 74
55 // protected 75 // protected
56 76
57 void FeatureTrajectory::computeMotionData(const int& frameNum) { 77 void FeatureTrajectory::computeMotionData(const int& frameNum) {
58 unsigned int nPositions = positions.size(); 78 unsigned int nPositions = positions.size();
59 if (nPositions >= 3) { 79 if (nPositions >= 2) {
60 Point2f displacement = positions[nPositions-1] - positions[nPositions-2]; 80 Point2f displacement = positions[nPositions-1] - positions[nPositions-2];
61 if (nPositions == 2) // duplicate first displacement so that positions and velocities have the same length 81 //if (nPositions == 2) // duplicate first displacement so that positions and velocities have the same length
62 velocities.add(frameNum-1, displacement); 82 //velocities.add(frameNum-1, displacement);
63 velocities.add(frameNum, displacement); 83 velocities.add(frameNum, displacement);
64 float dist = norm(displacement); 84 float dist = norm(displacement);
65 displacementDistances.push_back(dist); 85 displacementDistances.push_back(dist);
66 } 86 }
67 } 87 }