comparison c/Motion.cpp @ 614:5e09583275a4

Merged Nicolas/trafficintelligence into default
author Mohamed Gomaa <eng.m.gom3a@gmail.com>
date Fri, 05 Dec 2014 12:13:53 -0500
parents f86f5f25730a
children 045d05cef9d0
comparison
equal deleted inserted replaced
598:11f96bd08552 614:5e09583275a4
49 unsigned int nPositions = positions->size(); 49 unsigned int nPositions = positions->size();
50 if (nPositions > nDisplacements) { 50 if (nPositions > nDisplacements) {
51 float disp = 0; 51 float disp = 0;
52 for (unsigned int i=0; i<nDisplacements; i++) 52 for (unsigned int i=0; i<nDisplacements; i++)
53 disp += displacementDistances[nPositions-2-i]; 53 disp += displacementDistances[nPositions-2-i];
54 result = disp < minTotalFeatureDisplacement; 54 result = disp <= minTotalFeatureDisplacement;
55 } 55 }
56 return result; 56 return result;
57 } 57 }
58 58
59 bool FeatureTrajectory::isMotionSmooth(const int& accelerationBound, const int& deviationBound) const { 59 bool FeatureTrajectory::isMotionSmooth(const int& accelerationBound, const int& deviationBound) const {
64 if (displacementDistances[nPositions-2] > displacementDistances[nPositions-3]) 64 if (displacementDistances[nPositions-2] > displacementDistances[nPositions-3])
65 ratio = displacementDistances[nPositions-2] / displacementDistances[nPositions-3]; 65 ratio = displacementDistances[nPositions-2] / displacementDistances[nPositions-3];
66 else 66 else
67 ratio = displacementDistances[nPositions-3] / displacementDistances[nPositions-2]; 67 ratio = displacementDistances[nPositions-3] / displacementDistances[nPositions-2];
68 68
69 float cosine = scalarProduct((*velocities)[nPositions-3],(*velocities)[nPositions-2]) / (displacementDistances[nPositions-3] * displacementDistances[nPositions-2]); 69 float cosine = (*velocities)[nPositions-3].dot((*velocities)[nPositions-2]) / (displacementDistances[nPositions-3] * displacementDistances[nPositions-2]);
70 70
71 result &= (ratio < accelerationBound) & (cosine > deviationBound); 71 result = (ratio < accelerationBound) & (cosine > deviationBound);
72 } 72 }
73 return result; 73 return result;
74 } 74 }
75 75
76 bool FeatureTrajectory::minMaxSimilarity(const FeatureTrajectory& ft, const int& firstInstant, const int& lastInstant, const float& connectionDistance, const float& segmentationDistance) { 76 bool FeatureTrajectory::minMaxSimilarity(const FeatureTrajectory& ft, const int& firstInstant, const int& lastInstant, const float& connectionDistance, const float& segmentationDistance) {
107 107
108 void FeatureTrajectory::shorten(void) { 108 void FeatureTrajectory::shorten(void) {
109 positions->pop_back(); 109 positions->pop_back();
110 velocities->pop_back(); 110 velocities->pop_back();
111 displacementDistances.pop_back(); 111 displacementDistances.pop_back();
112 }
113
114 void FeatureTrajectory::movingAverage(const unsigned int& nFramesSmoothing) {
115 positions->movingAverage(nFramesSmoothing);
116 velocities->movingAverage(nFramesSmoothing);
112 } 117 }
113 118
114 void FeatureTrajectory::write(TrajectoryDBAccess<Point2f>& trajectoryDB, const string& positionsTableName, const string& velocitiesTableName) const { 119 void FeatureTrajectory::write(TrajectoryDBAccess<Point2f>& trajectoryDB, const string& positionsTableName, const string& velocitiesTableName) const {
115 trajectoryDB.write(*positions, positionsTableName); 120 trajectoryDB.write(*positions, positionsTableName);
116 trajectoryDB.write(*velocities, velocitiesTableName); 121 trajectoryDB.write(*velocities, velocitiesTableName);
162 int firstInstant = static_cast<int>(MAX(ft->getFirstInstant(), ft2->getFirstInstant())); 167 int firstInstant = static_cast<int>(MAX(ft->getFirstInstant(), ft2->getFirstInstant()));
163 if (lastInstant-firstInstant > static_cast<int>(minFeatureTime)) { // equivalent to lastInstant-firstInstant+1 >= minFeatureTime 168 if (lastInstant-firstInstant > static_cast<int>(minFeatureTime)) { // equivalent to lastInstant-firstInstant+1 >= minFeatureTime
164 if (ft->minMaxSimilarity(*ft2, firstInstant, lastInstant, connectionDistance, segmentationDistance)) { 169 if (ft->minMaxSimilarity(*ft2, firstInstant, lastInstant, connectionDistance, segmentationDistance)) {
165 UndirectedGraph::edge_descriptor e; 170 UndirectedGraph::edge_descriptor e;
166 bool unused; 171 bool unused;
167 tie(e, unused) = add_edge(newVertex, *vi, graph); 172 boost::tuples::tie(e, unused) = add_edge(newVertex, *vi, graph);
168 // no need to add measures to graph[e] (edge properties) 173 // no need to add measures to graph[e] (edge properties)
169 } 174 }
170 } 175 }
171 } 176 }
172 } 177 }
183 188
184 vector<unsigned int> lastInstants(num, 0); // last instant of component with id 189 vector<unsigned int> lastInstants(num, 0); // last instant of component with id
185 vector<vector<vertex_descriptor> > tmpobjects(num), objects; // vector of components (component = vector of vertex descriptors) 190 vector<vector<vertex_descriptor> > tmpobjects(num), objects; // vector of components (component = vector of vertex descriptors)
186 191
187 graph_traits<UndirectedGraph>::vertex_iterator vi, vend; 192 graph_traits<UndirectedGraph>::vertex_iterator vi, vend;
188 for(tie(vi,vend) = vertices(graph); vi != vend; ++vi) { 193 for(boost::tuples::tie(vi,vend) = vertices(graph); vi != vend; ++vi) {
189 unsigned int id = components[*vi]; 194 unsigned int id = components[*vi];
190 lastInstants[id] = max(lastInstants[id], graph[*vi].feature->getLastInstant()); 195 lastInstants[id] = max(lastInstants[id], graph[*vi].feature->getLastInstant());
191 tmpobjects[id].push_back(*vi); 196 tmpobjects[id].push_back(*vi);
192 } 197 }
193 198
199 if (lastInstants[i] < lastInstant) 204 if (lastInstants[i] < lastInstant)
200 objectHypotheses.push_back(tmpobjects[i]); 205 objectHypotheses.push_back(tmpobjects[i]);
201 } 206 }
202 } 207 }
203 208
204 vector<vector<unsigned int> > FeatureGraph::getFeatureGroups(void) { 209 void FeatureGraph::getFeatureGroups(vector<vector<FeatureTrajectoryPtr> >& featureGroups) {
205 vector<vector<unsigned int> > featureGroups; 210 featureGroups.clear();
206 211
207 for (unsigned int i=0; i<objectHypotheses.size(); ++i) { 212 for (unsigned int i=0; i<objectHypotheses.size(); ++i) {
208 // check that there is on average at least minNFeaturesPerGroup features at each frame in the group 213 // check that there is on average at least minNFeaturesPerGroup features at each frame in the group
209 unsigned int totalFeatureTime= graph[objectHypotheses[i][0]].feature->length(); 214 unsigned int totalFeatureTime= graph[objectHypotheses[i][0]].feature->length();
210 unsigned int firstInstant = graph[objectHypotheses[i][0]].feature->getFirstInstant(); 215 unsigned int firstInstant = graph[objectHypotheses[i][0]].feature->getFirstInstant();
216 } 221 }
217 if (static_cast<float>(totalFeatureTime)/static_cast<float>(lastInstant-firstInstant+1) > minNFeaturesPerGroup) { 222 if (static_cast<float>(totalFeatureTime)/static_cast<float>(lastInstant-firstInstant+1) > minNFeaturesPerGroup) {
218 #if DEBUG 223 #if DEBUG
219 cout << "save group " << i << " of " << objectHypotheses[i].size() << " features " << endl; 224 cout << "save group " << i << " of " << objectHypotheses[i].size() << " features " << endl;
220 #endif 225 #endif
221 featureGroups.push_back(vector<unsigned int>()); 226 featureGroups.push_back(vector<FeatureTrajectoryPtr>());
222 for (unsigned int j=0; j<objectHypotheses[i].size(); ++j) { 227 for (unsigned int j=0; j<objectHypotheses[i].size(); ++j) {
223 featureGroups.back().push_back(graph[objectHypotheses[i][j]].feature->getId()); 228 featureGroups.back().push_back(graph[objectHypotheses[i][j]].feature);
224 #if DEBUG 229 #if DEBUG
225 cout << featureGroups.size() << " " << objectHypotheses[i][j] << endl; 230 cout << featureGroups.size() << " " << objectHypotheses[i][j] << endl;
226 #endif 231 #endif
227 clear_vertex(objectHypotheses[i][j], graph); 232 clear_vertex(objectHypotheses[i][j], graph);
228 remove_vertex(objectHypotheses[i][j], graph); 233 remove_vertex(objectHypotheses[i][j], graph);
229 } 234 }
230 } 235 }
231 } 236 }
232
233 return featureGroups;
234 } 237 }
235 238
236 string FeatureGraph::informationString(void) const { 239 string FeatureGraph::informationString(void) const {
237 stringstream ss; 240 stringstream ss;
238 ss << num_vertices(graph) << " vertices, " << num_edges(graph) << " edges"; 241 ss << num_vertices(graph) << " vertices, " << num_edges(graph) << " edges";
244 int FeatureGraph::getNEdges(void) const { return num_edges(graph);} 247 int FeatureGraph::getNEdges(void) const { return num_edges(graph);}
245 248
246 void FeatureGraph::computeVertexIndex(void) { 249 void FeatureGraph::computeVertexIndex(void) {
247 graph_traits<FeatureGraph::UndirectedGraph>::vertex_iterator vi, vend; 250 graph_traits<FeatureGraph::UndirectedGraph>::vertex_iterator vi, vend;
248 graph_traits<FeatureGraph::UndirectedGraph>::vertices_size_type cnt = 0; 251 graph_traits<FeatureGraph::UndirectedGraph>::vertices_size_type cnt = 0;
249 for(tie(vi,vend) = vertices(graph); vi != vend; ++vi) 252 for(boost::tuples::tie(vi,vend) = vertices(graph); vi != vend; ++vi)
250 graph[*vi].index = cnt++; 253 graph[*vi].index = cnt++;
251 } 254 }