diff c/feature-based-tracking.cpp @ 231:249d65ff6c35

merged modifications for windows
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Mon, 02 Jul 2012 23:49:39 -0400
parents bc4ea09b1743 23da16442433
children 2d34060db2e9
line wrap: on
line diff
--- a/c/feature-based-tracking.cpp	Fri Jun 29 16:15:13 2012 -0400
+++ b/c/feature-based-tracking.cpp	Mon Jul 02 23:49:39 2012 -0400
@@ -76,38 +76,19 @@
   Size window = Size(params.windowSize, params.windowSize);
 
   // BruteForceMatcher<Hamming> descMatcher;
-  // std::vector<DMatch> matches;
-  Size videoSize;
-
-  // if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0]))) // if no parameter or number parameter
-  //   capture.open(argc == 2 ? argv[1][0] - '0' : 0);
-  // else if( argc >= 2 )
-  //   {
-  //     capture.open(argv[1]);
-  //     if( capture.isOpened() )
-  // 	videoSize = Size(capture.get(CV_CAP_PROP_FRAME_WIDTH), capture.get(CV_CAP_PROP_FRAME_HEIGHT));
-  // 	cout << "Video " << argv[1] <<
-  // 	  ": width=" << videoSize.width <<
-  // 	  ", height=" << videoSize.height <<
-  // 	  ", nframes=" << capture.get(CV_CAP_PROP_FRAME_COUNT) << endl;
-  //     if( argc > 2 && isdigit(argv[2][0]) ) // could be used to reach first frame, dumping library messages to log file (2> /tmp/log.txt)
-  //       {
-  // 	  sscanf(argv[2], "%d", &params.frame1);
-  //     	  cout << "seeking to frame #" << params.frame1 << endl;
-  //     	  //cap.set(CV_CAP_PROP_POS_FRAMES, pos);
-  // 	  for (int i=0; i<params.frame1; i++)
-  // 	    capture >> frame;
-  //       }
-  //   }
+  // vector<DMatch> matches;
 
   VideoCapture capture;
+  Size videoSize;
+  unsigned int nFrames = 0;
   capture.open(params.videoFilename);
   if(capture.isOpened()) {
     videoSize = Size(capture.get(CV_CAP_PROP_FRAME_WIDTH), capture.get(CV_CAP_PROP_FRAME_HEIGHT));
+    nFrames = capture.get(CV_CAP_PROP_FRAME_COUNT);
     cout << "Video " << params.videoFilename <<
       ": width=" << videoSize.width <<
       ", height=" << videoSize.height <<
-      ", nframes=" << capture.get(CV_CAP_PROP_FRAME_COUNT) << endl;
+      ", nframes=" << nFrames << endl;
   } else {
     cout << "Video filename " << params.videoFilename << " could not be opened. Exiting." << endl;
     exit(0);
@@ -145,17 +126,26 @@
   int key = '?';
   unsigned int savedFeatureId=0;
   Mat frame, currentFrameBW, previousFrameBW;
-  for (int frameNum = params.frame1; ((frameNum-params.frame1 < params.nFrames) || (params.nFrames < 0)) && !::interruptionKey(key); frameNum++) {
+
+  unsigned int lastFrameNum = params.frame1+nFrames;
+  if (params.nFrames > 0)
+    lastFrameNum = MIN(params.frame1+params.nFrames, nFrames);
+  
+  capture.set(CV_CAP_PROP_POS_FRAMES, params.frame1);
+  for (unsigned int frameNum = params.frame1; (frameNum < lastFrameNum) && !::interruptionKey(key); frameNum++) {
       capture >> frame;
-      cout << frameNum << " " << capture.get(CV_CAP_PROP_POS_FRAMES) << " " << prevPts.size() << endl;
-      int emptyFrameNum = 0;
-      while (frame.empty()) {
-	cerr << "empty frame " << emptyFrameNum  << " " << capture.get(CV_CAP_PROP_POS_FRAMES)<< endl;
-	capture >> frame;//break;
-	emptyFrameNum++;
-	if (emptyFrameNum>=3000)
-	  exit(0);
-      }
+      if (frameNum%50 ==0)
+	cout << "frame " << frameNum << endl;
+      //capture.get(CV_CAP_PROP_POS_FRAMES) << " " << prevPts.size() << endl;
+
+      // int emptyFrameNum = 0;
+      // while (frame.empty()) {
+      // 	cerr << "empty frame " << emptyFrameNum  << " " << capture.get(CV_CAP_PROP_POS_FRAMES)<< endl;
+      // 	capture >> frame;//break;
+      // 	emptyFrameNum++;
+      // 	if (emptyFrameNum>=3000)
+      // 	  exit(0);
+      // }
       
       cvtColor(frame, currentFrameBW, CV_RGB2GRAY);
       // "normal" feature detectors: detect features here
@@ -249,8 +239,6 @@
 }
 
 void groupFeatures(const KLTFeatureTrackingParameters& params) {
-  cout << "group" << endl;
-    
   boost::shared_ptr<TrajectoryDBAccessList<Point2f> > trajectoryDB = boost::shared_ptr<TrajectoryDBAccessList<Point2f> >(new TrajectoryDBAccessList<Point2f>());
   //TODO write generic methods for blob and list versions TrajectoryDBAccess<Point2f>* trajectoryDB = new TrajectoryDBAccessBlob<Point2f>();
   bool success = trajectoryDB->connect(params.databaseFilename.c_str());
@@ -272,21 +260,39 @@
   // c_end = std::clock();
   // cout << "Loaded " << trajectories.size() << " trajectories one by one in " << 1000.0 * (c_end-c_start) / CLOCKS_PER_SEC << " CPU seconds" << endl;
 
-  trajectoryDB->createViewInstants();
-  int maxTrajectoryLength;
-  trajectoryDB->maxTrajectoryLength(maxTrajectoryLength);
-  cout << "max trajectory length " << maxTrajectoryLength << endl;
-  maxTrajectoryLength = 20; // for tests
+  trajectoryDB->createInstants("table");
+
+  unsigned int maxTrajectoryLength = 0;
+  success = trajectoryDB->maxTrajectoryLength(maxTrajectoryLength);
+  if (!success || maxTrajectoryLength == 0) {
+    cout << "problem with trajectory length " << success << endl;
+    exit(0);
+  }
+  cout << "Longest trajectory: " << maxTrajectoryLength << endl;
 
   FeatureGraph featureGraph(params.mmConnectionDistance, params.mmSegmentationDistance, params.minFeatureTime, params.minNFeaturesPerGroup);
 
   // main loop
-  // TODO version that can be interrupted?
-  for (int frameNum = params.frame1; ((frameNum-params.frame1 < params.nFrames) || (params.nFrames < 0)); frameNum++) {
-    std::vector<int> trajectoryIds;
-    success  = trajectoryDB->trajectoryIdEndingAt(trajectoryIds, frameNum); // ending
-    cout << "frame " << frameNum << " " << success << endl;
+  unsigned int frameNum;
+  unsigned int firstFrameNum = -1, lastFrameNum = -1;
+  trajectoryDB->firstLastInstants(firstFrameNum, lastFrameNum);
+  firstFrameNum = MAX(firstFrameNum, params.frame1);
+  if (params.nFrames>0)
+    lastFrameNum = MIN(lastFrameNum,params.frame1+params.nFrames);
+  for (frameNum = firstFrameNum; frameNum<lastFrameNum; frameNum ++) {
+    vector<int> trajectoryIds;
+    success  = trajectoryDB->trajectoryIdEndingAt(trajectoryIds, frameNum);
+    if (frameNum%100 ==0)
+      cout << "frame " << frameNum << endl;
+    //success  = trajectoryDB->trajectoryIdInInterval(trajectoryIds, frameNum, min(frameNum+queryIntervalLength-1, frameNum+params.nFrames)); // ending
+#if DEBUG
     cout << trajectoryIds.size() << " trajectories " << endl;
+#endif
+    // vector<TrajectoryPoint2fPtr> positions, velocities;
+    // trajectoryDB->read(positions, trajectoryIds, "positions");
+    // trajectoryDB->read(velocities, trajectoryIds, "velocities");
+    // for (unsigned int i=0; i<trajectoryIds.size(); ++i) {
+    //   FeatureTrajectoryPtr ft = FeatureTrajectoryPtr(new FeatureTrajectory(positions[i], velocities[i]));
     BOOST_FOREACH(int trajectoryId, trajectoryIds) {
       //cout << trajectoryId << " " << endl;
       // boost::shared_ptr<Trajectory<cv::Point2f> > trajectory;
@@ -297,18 +303,27 @@
       featureGraph.addFeature(ft);
     }
 
-    // check for connected components that are old enough (no chance to match with trajectories to be added later
-    // we could check only when some features are getting old enough?
-    if (frameNum%10 == 0) {
-      featureGraph.connectedComponents(frameNum-maxTrajectoryLength+params.minFeatureTime);
-      std::vector<vector<unsigned int> > featureGroups = featureGraph.getFeatureGroups();
+    // check for connected components
+    int lastInstant = frameNum+params.minFeatureTime-maxTrajectoryLength;
+    if (lastInstant > 0 && frameNum%10==0) {
+      featureGraph.connectedComponents(lastInstant);
+      vector<vector<unsigned int> > featureGroups = featureGraph.getFeatureGroups();
       for (unsigned int i=0; i<featureGroups.size(); ++i) {
 	trajectoryDB->writeObject(savedObjectId, featureGroups[i], -1, 1, string("objects"), string("objects_features"));
 	savedObjectId++;
       }
     }
+    
+    if (frameNum%100 ==0)
+      cout << featureGraph.informationString() << endl;
+  }
 
-    cout << featureGraph.informationString() << endl;
+  // save remaining objects
+  featureGraph.connectedComponents(frameNum+maxTrajectoryLength+1);
+  vector<vector<unsigned int> > featureGroups = featureGraph.getFeatureGroups();
+  for (unsigned int i=0; i<featureGroups.size(); ++i) {
+    trajectoryDB->writeObject(savedObjectId, featureGroups[i], -1, 1, string("objects"), string("objects_features"));
+    savedObjectId++;
   }
 
   trajectoryDB->endTransaction();