comparison c/Motion.cpp @ 176:9323427aa0a3

changed positions and velocities to shared pointers and renamed methods
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Thu, 27 Oct 2011 13:56:46 -0400
parents cde87a07eb58
children ae2286b1a3fd
comparison
equal deleted inserted replaced
175:a234a5e818f3 176:9323427aa0a3
11 11
12 /******************** FeatureTrajectory ********************/ 12 /******************** FeatureTrajectory ********************/
13 13
14 FeatureTrajectory::FeatureTrajectory(const int& frameNum, const cv::Point2f& p, const Mat& homography) 14 FeatureTrajectory::FeatureTrajectory(const int& frameNum, const cv::Point2f& p, const Mat& homography)
15 : lost(false) { 15 : lost(false) {
16 positions = TrajectoryPoint2fPtr(new TrajectoryPoint2f());
17 velocities = TrajectoryPoint2fPtr(new TrajectoryPoint2f());
16 addPoint(frameNum, p, homography); 18 addPoint(frameNum, p, homography);
17 } 19 }
18 20
19 bool FeatureTrajectory::smallDisplacement(const unsigned int& nDisplacements, const float& minTotalFeatureDisplacement) const { 21 bool FeatureTrajectory::isDisplacementSmall(const unsigned int& nDisplacements, const float& minTotalFeatureDisplacement) const {
20 bool result = false; 22 bool result = false;
21 unsigned int nPositions = positions.size(); 23 unsigned int nPositions = positions->size();
22 if (nPositions > nDisplacements) { 24 if (nPositions > nDisplacements) {
23 float disp = 0; 25 float disp = 0;
24 for (unsigned int i=0; i<nDisplacements; i++) 26 for (unsigned int i=0; i<nDisplacements; i++)
25 disp += displacementDistances[nPositions-2-i]; 27 disp += displacementDistances[nPositions-2-i];
26 result = disp < minTotalFeatureDisplacement; 28 result = disp < minTotalFeatureDisplacement;
27 } 29 }
28 return result; 30 return result;
29 } 31 }
30 32
31 bool FeatureTrajectory::motionSmooth(const int& accelerationBound, const int& deviationBound) const { 33 bool FeatureTrajectory::isMotionSmooth(const int& accelerationBound, const int& deviationBound) const {
32 bool result = true; 34 bool result = true;
33 unsigned int nPositions = positions.size(); 35 unsigned int nPositions = positions->size();
34 if (nPositions >= 3) { 36 if (nPositions >= 3) {
35 float ratio; 37 float ratio;
36 if (displacementDistances[nPositions-2] > displacementDistances[nPositions-3]) 38 if (displacementDistances[nPositions-2] > displacementDistances[nPositions-3])
37 ratio = displacementDistances[nPositions-2] / displacementDistances[nPositions-3]; 39 ratio = displacementDistances[nPositions-2] / displacementDistances[nPositions-3];
38 else 40 else
39 ratio = displacementDistances[nPositions-3] / displacementDistances[nPositions-2]; 41 ratio = displacementDistances[nPositions-3] / displacementDistances[nPositions-2];
40 42
41 float cosine = scalarProduct(velocities[nPositions-3],velocities[nPositions-2]) / (displacementDistances[nPositions-3] * displacementDistances[nPositions-2]); 43 float cosine = scalarProduct((*velocities)[nPositions-3],(*velocities)[nPositions-2]) / (displacementDistances[nPositions-3] * displacementDistances[nPositions-2]);
42 44
43 result &= (ratio < accelerationBound) & (cosine > deviationBound); 45 result &= (ratio < accelerationBound) & (cosine > deviationBound);
44 } 46 }
45 return result; 47 return result;
46 } 48 }
47 49
48 void FeatureTrajectory::addPoint(const int& frameNum, const Point2f& p, const Mat& homography) { 50 void FeatureTrajectory::addPoint(const int& frameNum, const Point2f& p, const Mat& homography) {
49 Point2f pp = p; 51 Point2f pp = p;
50 if (!homography.empty()) 52 if (!homography.empty())
51 pp = project(p, homography); 53 pp = project(p, homography);
52 positions.add(frameNum, pp); 54 positions->add(frameNum, pp);
53 computeMotionData(frameNum); 55 computeMotionData(frameNum);
54 assert(positions.size() == displacementDistances.size()+1); 56 assert(positions.size() == displacementDistances.size()+1);
55 assert(positions.size() == velocities.size()+1); 57 assert(positions.size() == velocities.size()+1);
56 } 58 }
57 59
58 void FeatureTrajectory::shorten(void) { 60 void FeatureTrajectory::shorten(void) {
59 positions.pop_back(); 61 positions->pop_back();
60 velocities.pop_back(); 62 velocities->pop_back();
61 displacementDistances.pop_back(); 63 displacementDistances.pop_back();
62 } 64 }
63 65
64 void FeatureTrajectory::write(TrajectoryDBAccess<Point2f>& trajectoryDB, const string& positionsTableName, const string& velocitiesTableName) const { 66 void FeatureTrajectory::write(TrajectoryDBAccess<Point2f>& trajectoryDB, const string& positionsTableName, const string& velocitiesTableName) const {
65 trajectoryDB.write(positions, positionsTableName); 67 trajectoryDB.write(*positions, positionsTableName);
66 trajectoryDB.write(velocities, velocitiesTableName); 68 trajectoryDB.write(*velocities, velocitiesTableName);
67 } 69 }
68 70
69 #ifdef USE_OPENCV 71 #ifdef USE_OPENCV
70 /// \todo add option for anti-aliased drawing, thickness 72 /// \todo add option for anti-aliased drawing, thickness
71 void FeatureTrajectory::draw(Mat& img, const Mat& homography, const Scalar& color) const { 73 void FeatureTrajectory::draw(Mat& img, const Mat& homography, const Scalar& color) const {
72 Point2f p1, p2; 74 Point2f p1, p2;
73 if (!homography.empty()) 75 if (!homography.empty())
74 p1 = project(positions[0], homography); 76 p1 = project((*positions)[0], homography);
75 else 77 else
76 p1 = positions[0]; 78 p1 = (*positions)[0];
77 for (unsigned int i=1; i<positions.size(); i++) { 79 for (unsigned int i=1; i<positions->size(); i++) {
78 if (!homography.empty()) 80 if (!homography.empty())
79 p2 = project(positions[i], homography); 81 p2 = project((*positions)[i], homography);
80 else 82 else
81 p2 = positions[i]; 83 p2 = (*positions)[i];
82 line(img, p1, p2, color, 1); 84 line(img, p1, p2, color, 1);
83 p1 = p2; 85 p1 = p2;
84 } 86 }
85 } 87 }
86 #endif 88 #endif
87 89
88 // protected 90 // protected
89 91
90 void FeatureTrajectory::computeMotionData(const int& frameNum) { 92 void FeatureTrajectory::computeMotionData(const int& frameNum) {
91 unsigned int nPositions = positions.size(); 93 unsigned int nPositions = positions->size();
92 if (nPositions >= 2) { 94 if (nPositions >= 2) {
93 Point2f displacement = positions[nPositions-1] - positions[nPositions-2]; 95 Point2f displacement = (*positions)[nPositions-1] - (*positions)[nPositions-2];
94 //if (nPositions == 2) // duplicate first displacement so that positions and velocities have the same length 96 //if (nPositions == 2) // duplicate first displacement so that positions and velocities have the same length
95 //velocities.add(frameNum-1, displacement); 97 //velocities.add(frameNum-1, displacement);
96 velocities.add(frameNum, displacement); 98 velocities->add(frameNum, displacement);
97 float dist = norm(displacement); 99 float dist = norm(displacement);
98 displacementDistances.push_back(dist); 100 displacementDistances.push_back(dist);
99 } 101 }
100 } 102 }
101 103