changeset 192:38974d27dd2d

connected_components is working with listS for vertex list
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Mon, 12 Dec 2011 02:05:26 -0500
parents 0e60a306d324
children a728fce85881
files c/Motion.cpp include/Motion.hpp
diffstat 2 files changed, 24 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/c/Motion.cpp	Thu Dec 08 18:32:35 2011 -0500
+++ b/c/Motion.cpp	Mon Dec 12 02:05:26 2011 -0500
@@ -74,7 +74,7 @@
   return result;
 }
 
-bool FeatureTrajectory::minMaxSimilarity(const FeatureTrajectory& ft, const int& firstInstant, const int& lastInstant, float connectionDistance, float segmentationDistance) {
+bool FeatureTrajectory::minMaxSimilarity(const FeatureTrajectory& ft, const int& firstInstant, const int& lastInstant, const float& connectionDistance, const float& segmentationDistance) {
   float minDistance = norm(positions->getPointAtInstant(firstInstant)-ft.positions->getPointAtInstant(firstInstant));
   float maxDistance = minDistance;
   bool connected = (minDistance <= connectionDistance);
@@ -168,22 +168,23 @@
 }
 
 vector<vector<FeatureGraph::vertex_descriptor> > FeatureGraph::connectedComponents(const int& lastInstant) {
-  int nVertices = num_vertices(graph);
-  vector<vertex_descriptor> components(nVertices);
-  // map<UndirectedGraph::vertex_descriptor, graph_traits<UndirectedGraph>::vertices_size_type> vertex2component;
-  // associative_property_map< map<UndirectedGraph::vertex_descriptor, graph_traits<UndirectedGraph>::vertices_size_type> > components(vertex2component);
+  computeVertexIndex();
+  property_map<UndirectedGraph, int VertexInformation::*>::type components = get(&VertexInformation::index, graph);
 
-  int num = connected_components(graph, &components[0]);
+  int num = connected_components(graph, components, vertex_index_map(get(&VertexInformation::index, graph)));
   cout << "Total number of components: " << num << endl;
 
   vector<unsigned int> lastInstants(num, 0);
   vector<vector<vertex_descriptor> > tmpobjects(num), objects;
 
-  for (int i = 0; i < nVertices; ++i) {
-    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;
-    if (lastInstants[components[i]] < graph[i].feature->getLastInstant())
-      lastInstants[components[i]] = graph[i].feature->getLastInstant();
-    tmpobjects[components[i]].push_back(i);
+  graph_traits<UndirectedGraph>::vertex_iterator vi, vend;
+  for(tie(vi,vend) = vertices(graph); vi != vend; ++vi) {
+    //for (int i = 0; i < nVertices; ++i) {
+    unsigned int id = components[*vi];
+    cout << "Vertex " << *vi << " is in component " << id << endl;// "(last " << graph[i].feature->getLastInstant() << " " << lastInstants[components[i]] << " " << (lastInstants[components[i]] < graph[i].feature->getLastInstant()) << ")" << endl;
+    if (lastInstants[id] < graph[*vi].feature->getLastInstant())
+      lastInstants[id] = graph[*vi].feature->getLastInstant();
+    tmpobjects[id].push_back(*vi);
   }
 
   for (int i = 0; i < num; ++i) {
@@ -221,3 +222,10 @@
   ss << num_vertices(graph) << " vertices, " << num_edges(graph) << " edges";
   return ss.str();
 }
+
+void FeatureGraph::computeVertexIndex(void) {
+  graph_traits<FeatureGraph::UndirectedGraph>::vertex_iterator vi, vend;
+  graph_traits<FeatureGraph::UndirectedGraph>::vertices_size_type cnt = 0;
+  for(tie(vi,vend) = vertices(graph); vi != vend; ++vi)
+    graph[*vi].index = cnt++;
+}
--- a/include/Motion.hpp	Thu Dec 08 18:32:35 2011 -0500
+++ b/include/Motion.hpp	Mon Dec 12 02:05:26 2011 -0500
@@ -45,7 +45,7 @@
   bool isMotionSmooth(const int& accelerationBound, const int& deviationBound) const;
 
   /// computes the distance according to the Beymer et al. algorithm
-  bool minMaxSimilarity(const FeatureTrajectory& ft, const int& firstInstant, const int& lastInstant, float connectionDistance, float segmentationDistance);
+  bool minMaxSimilarity(const FeatureTrajectory& ft, const int& firstInstant, const int& lastInstant, const float& connectionDistance, const float& segmentationDistance);
 
   void addPoint(const int& frameNum, const cv::Point2f& p, const cv::Mat& homography);
 
@@ -101,14 +101,14 @@
   
   struct VertexInformation {
     FeatureTrajectoryPtr feature;
+    int index;
   };
 
-  typedef boost::adjacency_list<boost::listS, boost::vecS, boost::undirectedS, VertexInformation, FeatureConnection> UndirectedGraph;
+  typedef boost::adjacency_list<boost::listS, boost::listS, boost::undirectedS, VertexInformation, FeatureConnection> UndirectedGraph;
 
 public:
   typedef UndirectedGraph::vertex_descriptor vertex_descriptor;
 
-  //FeatureGraph(float _minDistance, float _maxDistance) : minDistance (_minDistance), maxDistance(_maxDistance) {}
   FeatureGraph(float _connectionDistance, float _segmentationDistance, unsigned int _minFeatureTime, float _minNFeaturesPerGroup) : connectionDistance (_connectionDistance), segmentationDistance(_segmentationDistance), minFeatureTime(_minFeatureTime), minNFeaturesPerGroup(_minNFeaturesPerGroup) {}
 
   void addFeature(const FeatureTrajectoryPtr& ft);
@@ -135,6 +135,8 @@
   // float maxDistance;
 
   UndirectedGraph graph;
+  
+  void computeVertexIndex(void);
 
   //std::vector<UndirectedGraph::vertex_descriptor> currentVertices, lostVertices;
 };