Mercurial Hosting > traffic-intelligence
annotate c/Motion.cpp @ 190:36968a63efe1
Got the connected_components to finally work using a vecS for the vertex list in the adjacency list.
In this case, the component map is simply a vector of ints (which is the type of UndirectedGraph::vextex_descriptor (=graph_traits<FeatureGraph>::vertex_descriptor) and probably UndirectedGraph::vertices_size_type).
To use listS, I was told on the Boost mailing list:
>> If you truly need listS, you will need to create a vertex index
>> map, fill it in before you create the property map, and pass it to the
>> vector_property_map constructor (and as a type argument to that class).
It may be feasible with a component map like
shared_array_property_map< graph_traits<FeatureGraph>::vertex_descriptor, property_map<FeatureGraph, vertex_index_t>::const_type > components(num_vertices(g), get(vertex_index, g));
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Wed, 07 Dec 2011 18:51:32 -0500 |
parents | 1116f0a1ff31 |
children | 0e60a306d324 |
rev | line source |
---|---|
136
0f790de9437e
renamed Feature to Motion files and added code to test blob db
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
135
diff
changeset
|
1 #include "Motion.hpp" |
139
47329bd16cc0
cleaned code, added condition on smooth displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
138
diff
changeset
|
2 #include "cvutils.hpp" |
129
4742b2b6d851
created basic feature saving code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
3 |
188
1435965d8181
work on connected components
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
187
diff
changeset
|
4 #include "src/TrajectoryDBAccessList.h" |
1435965d8181
work on connected components
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
187
diff
changeset
|
5 |
129
4742b2b6d851
created basic feature saving code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
6 #include "opencv2/core/core.hpp" |
132
45c64e68053c
added drawing function for features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
129
diff
changeset
|
7 #include "opencv2/highgui/highgui.hpp" |
129
4742b2b6d851
created basic feature saving code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
8 |
188
1435965d8181
work on connected components
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
187
diff
changeset
|
9 #include <boost/graph/connected_components.hpp> |
1435965d8181
work on connected components
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
187
diff
changeset
|
10 |
1435965d8181
work on connected components
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
187
diff
changeset
|
11 #include <iostream> |
1435965d8181
work on connected components
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
187
diff
changeset
|
12 #include <vector> |
1435965d8181
work on connected components
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
187
diff
changeset
|
13 #include <algorithm> |
1435965d8181
work on connected components
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
187
diff
changeset
|
14 #include <utility> |
133
63dd4355b6d1
saving of feature positions in sqlite database
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
132
diff
changeset
|
15 |
129
4742b2b6d851
created basic feature saving code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
16 using namespace std; |
4742b2b6d851
created basic feature saving code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
17 using namespace cv; |
190
36968a63efe1
Got the connected_components to finally work using a vecS for the vertex list in the adjacency list.
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
189
diff
changeset
|
18 using namespace boost; |
129
4742b2b6d851
created basic feature saving code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
19 |
163
cde87a07eb58
added graph structures
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
147
diff
changeset
|
20 /******************** FeatureTrajectory ********************/ |
cde87a07eb58
added graph structures
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
147
diff
changeset
|
21 |
cde87a07eb58
added graph structures
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
147
diff
changeset
|
22 FeatureTrajectory::FeatureTrajectory(const int& frameNum, const cv::Point2f& p, const Mat& homography) |
cde87a07eb58
added graph structures
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
147
diff
changeset
|
23 : lost(false) { |
176
9323427aa0a3
changed positions and velocities to shared pointers and renamed methods
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
163
diff
changeset
|
24 positions = TrajectoryPoint2fPtr(new TrajectoryPoint2f()); |
9323427aa0a3
changed positions and velocities to shared pointers and renamed methods
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
163
diff
changeset
|
25 velocities = TrajectoryPoint2fPtr(new TrajectoryPoint2f()); |
147
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
142
diff
changeset
|
26 addPoint(frameNum, p, homography); |
132
45c64e68053c
added drawing function for features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
129
diff
changeset
|
27 } |
45c64e68053c
added drawing function for features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
129
diff
changeset
|
28 |
177
ae2286b1a3fd
added loading FeatureTrajectory from database, printing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
176
diff
changeset
|
29 FeatureTrajectory::FeatureTrajectory(TrajectoryPoint2fPtr& _positions, TrajectoryPoint2fPtr& _velocities) |
ae2286b1a3fd
added loading FeatureTrajectory from database, printing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
176
diff
changeset
|
30 : lost(false) { |
ae2286b1a3fd
added loading FeatureTrajectory from database, printing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
176
diff
changeset
|
31 positions = _positions; |
ae2286b1a3fd
added loading FeatureTrajectory from database, printing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
176
diff
changeset
|
32 velocities = _velocities; |
ae2286b1a3fd
added loading FeatureTrajectory from database, printing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
176
diff
changeset
|
33 } |
ae2286b1a3fd
added loading FeatureTrajectory from database, printing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
176
diff
changeset
|
34 |
ae2286b1a3fd
added loading FeatureTrajectory from database, printing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
176
diff
changeset
|
35 FeatureTrajectory::FeatureTrajectory(const int& id, TrajectoryDBAccessList<Point2f>& trajectoryDB, const string& positionsTableName, const string& velocitiesTableName) { |
ae2286b1a3fd
added loading FeatureTrajectory from database, printing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
176
diff
changeset
|
36 bool success = trajectoryDB.read(positions, id, positionsTableName); |
ae2286b1a3fd
added loading FeatureTrajectory from database, printing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
176
diff
changeset
|
37 if (!success) |
ae2286b1a3fd
added loading FeatureTrajectory from database, printing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
176
diff
changeset
|
38 cout << "problem loading positions" << endl; |
ae2286b1a3fd
added loading FeatureTrajectory from database, printing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
176
diff
changeset
|
39 success = trajectoryDB.read(velocities, id, velocitiesTableName); |
ae2286b1a3fd
added loading FeatureTrajectory from database, printing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
176
diff
changeset
|
40 if (!success) |
ae2286b1a3fd
added loading FeatureTrajectory from database, printing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
176
diff
changeset
|
41 cout << "problem loading velocities" << endl; |
179
4f10e97cb677
added getting first and last instant for each feature
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
177
diff
changeset
|
42 // take advantage to request first and last instant from database |
4f10e97cb677
added getting first and last instant for each feature
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
177
diff
changeset
|
43 trajectoryDB.timeInterval(firstInstant, lastInstant, id); |
177
ae2286b1a3fd
added loading FeatureTrajectory from database, printing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
176
diff
changeset
|
44 } |
ae2286b1a3fd
added loading FeatureTrajectory from database, printing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
176
diff
changeset
|
45 |
176
9323427aa0a3
changed positions and velocities to shared pointers and renamed methods
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
163
diff
changeset
|
46 bool FeatureTrajectory::isDisplacementSmall(const unsigned int& nDisplacements, const float& minTotalFeatureDisplacement) const { |
138
c1b260b48d2a
corrected initialization bugs and feature shortening before saving
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
137
diff
changeset
|
47 bool result = false; |
176
9323427aa0a3
changed positions and velocities to shared pointers and renamed methods
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
163
diff
changeset
|
48 unsigned int nPositions = positions->size(); |
135
32d2722d4028
added constraint on minimum displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
133
diff
changeset
|
49 if (nPositions > nDisplacements) { |
32d2722d4028
added constraint on minimum displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
133
diff
changeset
|
50 float disp = 0; |
137
445e773c9be3
created the parameter structure to parse parameters (bug remaining)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
136
diff
changeset
|
51 for (unsigned int i=0; i<nDisplacements; i++) |
135
32d2722d4028
added constraint on minimum displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
133
diff
changeset
|
52 disp += displacementDistances[nPositions-2-i]; |
138
c1b260b48d2a
corrected initialization bugs and feature shortening before saving
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
137
diff
changeset
|
53 result = disp < minTotalFeatureDisplacement; |
135
32d2722d4028
added constraint on minimum displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
133
diff
changeset
|
54 } |
32d2722d4028
added constraint on minimum displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
133
diff
changeset
|
55 return result; |
32d2722d4028
added constraint on minimum displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
133
diff
changeset
|
56 } |
32d2722d4028
added constraint on minimum displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
133
diff
changeset
|
57 |
176
9323427aa0a3
changed positions and velocities to shared pointers and renamed methods
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
163
diff
changeset
|
58 bool FeatureTrajectory::isMotionSmooth(const int& accelerationBound, const int& deviationBound) const { |
139
47329bd16cc0
cleaned code, added condition on smooth displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
138
diff
changeset
|
59 bool result = true; |
176
9323427aa0a3
changed positions and velocities to shared pointers and renamed methods
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
163
diff
changeset
|
60 unsigned int nPositions = positions->size(); |
139
47329bd16cc0
cleaned code, added condition on smooth displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
138
diff
changeset
|
61 if (nPositions >= 3) { |
47329bd16cc0
cleaned code, added condition on smooth displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
138
diff
changeset
|
62 float ratio; |
47329bd16cc0
cleaned code, added condition on smooth displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
138
diff
changeset
|
63 if (displacementDistances[nPositions-2] > displacementDistances[nPositions-3]) |
47329bd16cc0
cleaned code, added condition on smooth displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
138
diff
changeset
|
64 ratio = displacementDistances[nPositions-2] / displacementDistances[nPositions-3]; |
47329bd16cc0
cleaned code, added condition on smooth displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
138
diff
changeset
|
65 else |
47329bd16cc0
cleaned code, added condition on smooth displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
138
diff
changeset
|
66 ratio = displacementDistances[nPositions-3] / displacementDistances[nPositions-2]; |
47329bd16cc0
cleaned code, added condition on smooth displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
138
diff
changeset
|
67 |
176
9323427aa0a3
changed positions and velocities to shared pointers and renamed methods
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
163
diff
changeset
|
68 float cosine = scalarProduct((*velocities)[nPositions-3],(*velocities)[nPositions-2]) / (displacementDistances[nPositions-3] * displacementDistances[nPositions-2]); |
139
47329bd16cc0
cleaned code, added condition on smooth displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
138
diff
changeset
|
69 |
47329bd16cc0
cleaned code, added condition on smooth displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
138
diff
changeset
|
70 result &= (ratio < accelerationBound) & (cosine > deviationBound); |
47329bd16cc0
cleaned code, added condition on smooth displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
138
diff
changeset
|
71 } |
47329bd16cc0
cleaned code, added condition on smooth displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
138
diff
changeset
|
72 return result; |
47329bd16cc0
cleaned code, added condition on smooth displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
138
diff
changeset
|
73 } |
47329bd16cc0
cleaned code, added condition on smooth displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
138
diff
changeset
|
74 |
186
6c48283a78ca
work on feature similarity, issue with getting point
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
180
diff
changeset
|
75 bool FeatureTrajectory::minMaxSimilarity(const FeatureTrajectory& ft, const int& firstInstant, const int& lastInstant, float connectionDistance, float segmentationDistance) { |
187
aa1061fb9695
using minmaxsimilarity
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
186
diff
changeset
|
76 float minDistance = norm(positions->getPointAtInstant(firstInstant)-ft.positions->getPointAtInstant(firstInstant)); |
186
6c48283a78ca
work on feature similarity, issue with getting point
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
180
diff
changeset
|
77 float maxDistance = minDistance; |
190
36968a63efe1
Got the connected_components to finally work using a vecS for the vertex list in the adjacency list.
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
189
diff
changeset
|
78 bool connected = (minDistance <= connectionDistance); |
186
6c48283a78ca
work on feature similarity, issue with getting point
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
180
diff
changeset
|
79 int t=firstInstant+1; |
6c48283a78ca
work on feature similarity, issue with getting point
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
180
diff
changeset
|
80 while (t <= lastInstant && connected) { |
187
aa1061fb9695
using minmaxsimilarity
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
186
diff
changeset
|
81 float distance = norm(positions->getPointAtInstant(t)-ft.positions->getPointAtInstant(t)); |
186
6c48283a78ca
work on feature similarity, issue with getting point
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
180
diff
changeset
|
82 if (distance < minDistance) |
6c48283a78ca
work on feature similarity, issue with getting point
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
180
diff
changeset
|
83 minDistance = distance; |
6c48283a78ca
work on feature similarity, issue with getting point
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
180
diff
changeset
|
84 else if (distance > maxDistance) |
6c48283a78ca
work on feature similarity, issue with getting point
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
180
diff
changeset
|
85 maxDistance = distance; |
6c48283a78ca
work on feature similarity, issue with getting point
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
180
diff
changeset
|
86 connected = connected && (maxDistance-minDistance < segmentationDistance); |
6c48283a78ca
work on feature similarity, issue with getting point
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
180
diff
changeset
|
87 t++; |
6c48283a78ca
work on feature similarity, issue with getting point
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
180
diff
changeset
|
88 } |
6c48283a78ca
work on feature similarity, issue with getting point
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
180
diff
changeset
|
89 |
6c48283a78ca
work on feature similarity, issue with getting point
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
180
diff
changeset
|
90 return connected; |
6c48283a78ca
work on feature similarity, issue with getting point
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
180
diff
changeset
|
91 } |
6c48283a78ca
work on feature similarity, issue with getting point
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
180
diff
changeset
|
92 |
147
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
142
diff
changeset
|
93 void FeatureTrajectory::addPoint(const int& frameNum, const Point2f& p, const Mat& homography) { |
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
142
diff
changeset
|
94 Point2f pp = p; |
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
142
diff
changeset
|
95 if (!homography.empty()) |
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
142
diff
changeset
|
96 pp = project(p, homography); |
176
9323427aa0a3
changed positions and velocities to shared pointers and renamed methods
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
163
diff
changeset
|
97 positions->add(frameNum, pp); |
129
4742b2b6d851
created basic feature saving code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
98 computeMotionData(frameNum); |
139
47329bd16cc0
cleaned code, added condition on smooth displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
138
diff
changeset
|
99 assert(positions.size() == displacementDistances.size()+1); |
47329bd16cc0
cleaned code, added condition on smooth displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
138
diff
changeset
|
100 assert(positions.size() == velocities.size()+1); |
129
4742b2b6d851
created basic feature saving code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
101 } |
4742b2b6d851
created basic feature saving code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
102 |
138
c1b260b48d2a
corrected initialization bugs and feature shortening before saving
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
137
diff
changeset
|
103 void FeatureTrajectory::shorten(void) { |
176
9323427aa0a3
changed positions and velocities to shared pointers and renamed methods
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
163
diff
changeset
|
104 positions->pop_back(); |
9323427aa0a3
changed positions and velocities to shared pointers and renamed methods
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
163
diff
changeset
|
105 velocities->pop_back(); |
138
c1b260b48d2a
corrected initialization bugs and feature shortening before saving
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
137
diff
changeset
|
106 displacementDistances.pop_back(); |
c1b260b48d2a
corrected initialization bugs and feature shortening before saving
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
137
diff
changeset
|
107 } |
c1b260b48d2a
corrected initialization bugs and feature shortening before saving
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
137
diff
changeset
|
108 |
142
a3532db00c28
added code to write velocities
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
139
diff
changeset
|
109 void FeatureTrajectory::write(TrajectoryDBAccess<Point2f>& trajectoryDB, const string& positionsTableName, const string& velocitiesTableName) const { |
176
9323427aa0a3
changed positions and velocities to shared pointers and renamed methods
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
163
diff
changeset
|
110 trajectoryDB.write(*positions, positionsTableName); |
9323427aa0a3
changed positions and velocities to shared pointers and renamed methods
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
163
diff
changeset
|
111 trajectoryDB.write(*velocities, velocitiesTableName); |
133
63dd4355b6d1
saving of feature positions in sqlite database
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
132
diff
changeset
|
112 } |
63dd4355b6d1
saving of feature positions in sqlite database
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
132
diff
changeset
|
113 |
132
45c64e68053c
added drawing function for features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
129
diff
changeset
|
114 #ifdef USE_OPENCV |
45c64e68053c
added drawing function for features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
129
diff
changeset
|
115 /// \todo add option for anti-aliased drawing, thickness |
147
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
142
diff
changeset
|
116 void FeatureTrajectory::draw(Mat& img, const Mat& homography, const Scalar& color) const { |
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
142
diff
changeset
|
117 Point2f p1, p2; |
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
142
diff
changeset
|
118 if (!homography.empty()) |
176
9323427aa0a3
changed positions and velocities to shared pointers and renamed methods
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
163
diff
changeset
|
119 p1 = project((*positions)[0], homography); |
147
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
142
diff
changeset
|
120 else |
176
9323427aa0a3
changed positions and velocities to shared pointers and renamed methods
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
163
diff
changeset
|
121 p1 = (*positions)[0]; |
9323427aa0a3
changed positions and velocities to shared pointers and renamed methods
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
163
diff
changeset
|
122 for (unsigned int i=1; i<positions->size(); i++) { |
147
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
142
diff
changeset
|
123 if (!homography.empty()) |
176
9323427aa0a3
changed positions and velocities to shared pointers and renamed methods
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
163
diff
changeset
|
124 p2 = project((*positions)[i], homography); |
147
0089fb29cd26
added projection of points and reprojection for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
142
diff
changeset
|
125 else |
176
9323427aa0a3
changed positions and velocities to shared pointers and renamed methods
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
163
diff
changeset
|
126 p2 = (*positions)[i]; |
132
45c64e68053c
added drawing function for features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
129
diff
changeset
|
127 line(img, p1, p2, color, 1); |
45c64e68053c
added drawing function for features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
129
diff
changeset
|
128 p1 = p2; |
45c64e68053c
added drawing function for features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
129
diff
changeset
|
129 } |
45c64e68053c
added drawing function for features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
129
diff
changeset
|
130 } |
45c64e68053c
added drawing function for features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
129
diff
changeset
|
131 #endif |
45c64e68053c
added drawing function for features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
129
diff
changeset
|
132 |
129
4742b2b6d851
created basic feature saving code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
133 // protected |
4742b2b6d851
created basic feature saving code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
134 |
4742b2b6d851
created basic feature saving code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
135 void FeatureTrajectory::computeMotionData(const int& frameNum) { |
176
9323427aa0a3
changed positions and velocities to shared pointers and renamed methods
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
163
diff
changeset
|
136 unsigned int nPositions = positions->size(); |
139
47329bd16cc0
cleaned code, added condition on smooth displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
138
diff
changeset
|
137 if (nPositions >= 2) { |
176
9323427aa0a3
changed positions and velocities to shared pointers and renamed methods
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
163
diff
changeset
|
138 Point2f displacement = (*positions)[nPositions-1] - (*positions)[nPositions-2]; |
139
47329bd16cc0
cleaned code, added condition on smooth displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
138
diff
changeset
|
139 //if (nPositions == 2) // duplicate first displacement so that positions and velocities have the same length |
47329bd16cc0
cleaned code, added condition on smooth displacement
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
138
diff
changeset
|
140 //velocities.add(frameNum-1, displacement); |
176
9323427aa0a3
changed positions and velocities to shared pointers and renamed methods
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
163
diff
changeset
|
141 velocities->add(frameNum, displacement); |
129
4742b2b6d851
created basic feature saving code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
142 float dist = norm(displacement); |
4742b2b6d851
created basic feature saving code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
143 displacementDistances.push_back(dist); |
4742b2b6d851
created basic feature saving code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
144 } |
4742b2b6d851
created basic feature saving code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
145 } |
163
cde87a07eb58
added graph structures
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
147
diff
changeset
|
146 |
cde87a07eb58
added graph structures
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
147
diff
changeset
|
147 /******************** FeatureGraph ********************/ |
179
4f10e97cb677
added getting first and last instant for each feature
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
177
diff
changeset
|
148 |
180
3a4eef37384f
method to add features and vertices to graph
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
179
diff
changeset
|
149 void FeatureGraph::addFeature(const FeatureTrajectoryPtr& ft) { |
3a4eef37384f
method to add features and vertices to graph
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
179
diff
changeset
|
150 UndirectedGraph::vertex_descriptor newVertex = add_vertex(graph); |
3a4eef37384f
method to add features and vertices to graph
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
179
diff
changeset
|
151 graph[newVertex].feature = ft; |
190
36968a63efe1
Got the connected_components to finally work using a vecS for the vertex list in the adjacency list.
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
189
diff
changeset
|
152 for (graph_traits<UndirectedGraph>::vertex_iterator vi = vertices(graph).first; |
180
3a4eef37384f
method to add features and vertices to graph
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
179
diff
changeset
|
153 vi!=vertices(graph).second; ++vi) { // vi pointer to vertex_descriptor |
3a4eef37384f
method to add features and vertices to graph
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
179
diff
changeset
|
154 FeatureTrajectoryPtr ft2 = graph[*vi].feature; |
187
aa1061fb9695
using minmaxsimilarity
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
186
diff
changeset
|
155 int lastInstant = static_cast<int>(min(ft->getLastInstant(), ft2->getLastInstant())); |
aa1061fb9695
using minmaxsimilarity
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
186
diff
changeset
|
156 int firstInstant = static_cast<int>(max(ft->getFirstInstant(), ft2->getFirstInstant())); |
aa1061fb9695
using minmaxsimilarity
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
186
diff
changeset
|
157 if (lastInstant-firstInstant > static_cast<int>(minFeatureTime)) { // equivalent to lastInstant-firstInstant+1 >= minFeatureTime |
186
6c48283a78ca
work on feature similarity, issue with getting point
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
180
diff
changeset
|
158 if (ft->minMaxSimilarity(*ft2, firstInstant, lastInstant, connectionDistance, segmentationDistance)) { |
6c48283a78ca
work on feature similarity, issue with getting point
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
180
diff
changeset
|
159 UndirectedGraph::edge_descriptor e; |
6c48283a78ca
work on feature similarity, issue with getting point
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
180
diff
changeset
|
160 bool unused; |
6c48283a78ca
work on feature similarity, issue with getting point
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
180
diff
changeset
|
161 tie(e, unused) = add_edge(newVertex, *vi, graph); |
189
1116f0a1ff31
work on connected components (does not compile)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
188
diff
changeset
|
162 // no need to add measures to graph[e] (edge properties) |
186
6c48283a78ca
work on feature similarity, issue with getting point
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
180
diff
changeset
|
163 } |
180
3a4eef37384f
method to add features and vertices to graph
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
179
diff
changeset
|
164 } |
3a4eef37384f
method to add features and vertices to graph
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
179
diff
changeset
|
165 } |
3a4eef37384f
method to add features and vertices to graph
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
179
diff
changeset
|
166 } |
3a4eef37384f
method to add features and vertices to graph
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
179
diff
changeset
|
167 |
188
1435965d8181
work on connected components
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
187
diff
changeset
|
168 void FeatureGraph::connectedComponents(const int& lastInstant) { |
190
36968a63efe1
Got the connected_components to finally work using a vecS for the vertex list in the adjacency list.
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
189
diff
changeset
|
169 vector<UndirectedGraph::vertex_descriptor> components(num_vertices(graph)); |
36968a63efe1
Got the connected_components to finally work using a vecS for the vertex list in the adjacency list.
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
189
diff
changeset
|
170 //vector_property_map<UndirectedGraph::vertex_descriptor> components(num_vertices(graph)); |
36968a63efe1
Got the connected_components to finally work using a vecS for the vertex list in the adjacency list.
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
189
diff
changeset
|
171 //vector_property_map< graph_traits<UndirectedGraph>::vertex_descriptor, property_map<UndirectedGraph, vertex_index_t>::const_type > components(num_vertices(graph)); |
188
1435965d8181
work on connected components
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
187
diff
changeset
|
172 |
190
36968a63efe1
Got the connected_components to finally work using a vecS for the vertex list in the adjacency list.
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
189
diff
changeset
|
173 int num = connected_components(graph, &components[0]); |
36968a63efe1
Got the connected_components to finally work using a vecS for the vertex list in the adjacency list.
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
189
diff
changeset
|
174 cout << "Total number of components: " << num << endl; |
36968a63efe1
Got the connected_components to finally work using a vecS for the vertex list in the adjacency list.
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
189
diff
changeset
|
175 |
36968a63efe1
Got the connected_components to finally work using a vecS for the vertex list in the adjacency list.
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
189
diff
changeset
|
176 for (unsigned int i = 0; i < num_vertices(graph); ++i) |
36968a63efe1
Got the connected_components to finally work using a vecS for the vertex list in the adjacency list.
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
189
diff
changeset
|
177 cout << "Vertex " << i <<" is in component " << components[i] << endl; |
36968a63efe1
Got the connected_components to finally work using a vecS for the vertex list in the adjacency list.
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
189
diff
changeset
|
178 cout << endl; |
188
1435965d8181
work on connected components
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
187
diff
changeset
|
179 } |
1435965d8181
work on connected components
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
187
diff
changeset
|
180 |
180
3a4eef37384f
method to add features and vertices to graph
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
179
diff
changeset
|
181 string FeatureGraph::informationString(void) { |
3a4eef37384f
method to add features and vertices to graph
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
179
diff
changeset
|
182 stringstream ss; |
3a4eef37384f
method to add features and vertices to graph
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
179
diff
changeset
|
183 ss << num_vertices(graph) << " vertices, " << num_edges(graph) << " edges"; |
3a4eef37384f
method to add features and vertices to graph
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
179
diff
changeset
|
184 return ss.str(); |
3a4eef37384f
method to add features and vertices to graph
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
179
diff
changeset
|
185 } |