Mercurial Hosting > traffic-intelligence
comparison c/Motion.cpp @ 191:0e60a306d324
added basic code to identify features and save them (crash)
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Thu, 08 Dec 2011 18:32:35 -0500 |
parents | 36968a63efe1 |
children | 38974d27dd2d |
comparison
equal
deleted
inserted
replaced
190:36968a63efe1 | 191:0e60a306d324 |
---|---|
5 | 5 |
6 #include "opencv2/core/core.hpp" | 6 #include "opencv2/core/core.hpp" |
7 #include "opencv2/highgui/highgui.hpp" | 7 #include "opencv2/highgui/highgui.hpp" |
8 | 8 |
9 #include <boost/graph/connected_components.hpp> | 9 #include <boost/graph/connected_components.hpp> |
10 #include <boost/property_map/property_map.hpp> | |
10 | 11 |
11 #include <iostream> | 12 #include <iostream> |
12 #include <vector> | 13 #include <vector> |
14 #include <map> | |
13 #include <algorithm> | 15 #include <algorithm> |
14 #include <utility> | 16 #include <utility> |
15 | 17 |
16 using namespace std; | 18 using namespace std; |
17 using namespace cv; | 19 using namespace cv; |
145 } | 147 } |
146 | 148 |
147 /******************** FeatureGraph ********************/ | 149 /******************** FeatureGraph ********************/ |
148 | 150 |
149 void FeatureGraph::addFeature(const FeatureTrajectoryPtr& ft) { | 151 void FeatureGraph::addFeature(const FeatureTrajectoryPtr& ft) { |
150 UndirectedGraph::vertex_descriptor newVertex = add_vertex(graph); | 152 vertex_descriptor newVertex = add_vertex(graph); |
151 graph[newVertex].feature = ft; | 153 graph[newVertex].feature = ft; |
152 for (graph_traits<UndirectedGraph>::vertex_iterator vi = vertices(graph).first; | 154 for (graph_traits<UndirectedGraph>::vertex_iterator vi = vertices(graph).first; |
153 vi!=vertices(graph).second; ++vi) { // vi pointer to vertex_descriptor | 155 vi!=vertices(graph).second; ++vi) { // vi pointer to vertex_descriptor |
154 FeatureTrajectoryPtr ft2 = graph[*vi].feature; | 156 FeatureTrajectoryPtr ft2 = graph[*vi].feature; |
155 int lastInstant = static_cast<int>(min(ft->getLastInstant(), ft2->getLastInstant())); | 157 int lastInstant = static_cast<int>(min(ft->getLastInstant(), ft2->getLastInstant())); |
163 } | 165 } |
164 } | 166 } |
165 } | 167 } |
166 } | 168 } |
167 | 169 |
168 void FeatureGraph::connectedComponents(const int& lastInstant) { | 170 vector<vector<FeatureGraph::vertex_descriptor> > FeatureGraph::connectedComponents(const int& lastInstant) { |
169 vector<UndirectedGraph::vertex_descriptor> components(num_vertices(graph)); | 171 int nVertices = num_vertices(graph); |
170 //vector_property_map<UndirectedGraph::vertex_descriptor> components(num_vertices(graph)); | 172 vector<vertex_descriptor> components(nVertices); |
171 //vector_property_map< graph_traits<UndirectedGraph>::vertex_descriptor, property_map<UndirectedGraph, vertex_index_t>::const_type > components(num_vertices(graph)); | 173 // map<UndirectedGraph::vertex_descriptor, graph_traits<UndirectedGraph>::vertices_size_type> vertex2component; |
174 // associative_property_map< map<UndirectedGraph::vertex_descriptor, graph_traits<UndirectedGraph>::vertices_size_type> > components(vertex2component); | |
172 | 175 |
173 int num = connected_components(graph, &components[0]); | 176 int num = connected_components(graph, &components[0]); |
174 cout << "Total number of components: " << num << endl; | 177 cout << "Total number of components: " << num << endl; |
175 | 178 |
176 for (unsigned int i = 0; i < num_vertices(graph); ++i) | 179 vector<unsigned int> lastInstants(num, 0); |
177 cout << "Vertex " << i <<" is in component " << components[i] << endl; | 180 vector<vector<vertex_descriptor> > tmpobjects(num), objects; |
178 cout << endl; | 181 |
182 for (int i = 0; i < nVertices; ++i) { | |
183 cout << "Vertex " << i <<" is in component " << components[i] << endl;// "(last " << graph[i].feature->getLastInstant() << " " << lastInstants[components[i]] << " " << (lastInstants[components[i]] < graph[i].feature->getLastInstant()) << ")" << endl; | |
184 if (lastInstants[components[i]] < graph[i].feature->getLastInstant()) | |
185 lastInstants[components[i]] = graph[i].feature->getLastInstant(); | |
186 tmpobjects[components[i]].push_back(i); | |
187 } | |
188 | |
189 for (int i = 0; i < num; ++i) { | |
190 cout << i << " " << lastInstants[i] << endl; | |
191 if (static_cast<int>(lastInstants[i]) < lastInstant) | |
192 objects.push_back(tmpobjects[i]); | |
193 } | |
194 | |
195 return objects; | |
196 } | |
197 | |
198 vector<vector<unsigned int> > FeatureGraph::getFeatureGroups(const vector<vector<FeatureGraph::vertex_descriptor> >& objectHypotheses) { | |
199 vector<vector<unsigned int> > featureGroups; | |
200 | |
201 for (unsigned int i=0; i<objectHypotheses.size(); ++i) { | |
202 // check that there is on average at least minNFeaturesPerGroup features at each frame in the group | |
203 float totalFeatureTime=0; | |
204 for (unsigned int j=0; j<objectHypotheses.size(); ++j) | |
205 totalFeatureTime += static_cast<float>(graph[objectHypotheses[i][j]].feature->length()); | |
206 | |
207 if (totalFeatureTime/static_cast<float>(objectHypotheses.size()) > minNFeaturesPerGroup) { | |
208 cout << "save group" << endl; | |
209 featureGroups.push_back(vector<unsigned int>()); | |
210 for (unsigned int j=0; j<objectHypotheses.size(); ++j) | |
211 featureGroups.back().push_back(graph[objectHypotheses[i][j]].feature->getId()); | |
212 } | |
213 // remove vertices: todo using listS | |
214 } | |
215 | |
216 return featureGroups; | |
179 } | 217 } |
180 | 218 |
181 string FeatureGraph::informationString(void) { | 219 string FeatureGraph::informationString(void) { |
182 stringstream ss; | 220 stringstream ss; |
183 ss << num_vertices(graph) << " vertices, " << num_edges(graph) << " edges"; | 221 ss << num_vertices(graph) << " vertices, " << num_edges(graph) << " edges"; |