[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60079] branches/soc-2013-motion_track/ extern/libmv/libmv/simple_pipeline: Modify keyframe selection algorithm to be camera-aware

Joseph Mansfield sftrabbit at gmail.com
Thu Sep 12 18:16:08 CEST 2013


Revision: 60079
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60079
Author:   sftrabbit
Date:     2013-09-12 16:16:08 +0000 (Thu, 12 Sep 2013)
Log Message:
-----------
Modify keyframe selection algorithm to be camera-aware

The keyframe selection algorithm can now select keyframes from the camera passed to it as an argument. It's worth looking into multicamera algorithms too.

Modified Paths:
--------------
    branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/keyframe_selection.cc
    branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/keyframe_selection.h

Modified: branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/keyframe_selection.cc
===================================================================
--- branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/keyframe_selection.cc	2013-09-12 15:30:37 UTC (rev 60078)
+++ branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/keyframe_selection.cc	2013-09-12 16:16:08 UTC (rev 60079)
@@ -291,16 +291,17 @@
 void SelectKeyframesBasedOnGRICAndVariance(
     const Tracks &tracks,
     const std::vector<CameraIntrinsics> &intrinsics,
+    int camera,
     vector<int> &keyframes) {
   // Mirza Tahir Ahmed, Matthew N. Dailey
   // Robust key frame extraction for 3D reconstruction from video streams
   //
   // http://www.cs.ait.ac.th/~mdailey/papers/Tahir-KeyFrame.pdf
 
-  static const int kSelectionCamera = 0;
-  const CameraIntrinsics &selection_intrinsics = intrinsics[kSelectionCamera];
+  Tracks camera_tracks(tracks.MarkersForCamera(camera));
+  const CameraIntrinsics &camera_intrinsics = intrinsics[camera];
 
-  int max_image = tracks.MaxImage();
+  int max_image = camera_tracks.MaxImage();
   int next_keyframe = 1;
   int number_keyframes = 0;
 
@@ -312,7 +313,7 @@
   const double Tmin = 0.8;
   const double Tmax = 1.0;
 
-  Mat3 N = IntrinsicsNormalizationMatrix(selection_intrinsics);
+  Mat3 N = IntrinsicsNormalizationMatrix(camera_intrinsics);
   Mat3 N_inverse = N.inverse();
 
   double Sc_best = std::numeric_limits<double>::max();
@@ -332,11 +333,11 @@
          candidate_image++) {
       // Conjunction of all markers from both keyframes
       vector<Marker> all_markers =
-        tracks.MarkersInBothImages(current_keyframe, candidate_image);
+        camera_tracks.MarkersInBothImages(current_keyframe, candidate_image);
 
       // Match keypoints between frames current_keyframe and candidate_image
       vector<Marker> tracked_markers =
-        tracks.MarkersForTracksInBothImages(current_keyframe, candidate_image);
+        camera_tracks.MarkersForTracksInBothImages(current_keyframe, candidate_image);
 
       // Correspondences in normalized space
       Mat x1, x2;
@@ -364,8 +365,8 @@
         continue;
 
       Mat3 H, F;
-      ComputeHomographyFromCorrespondences(x1, x2, selection_intrinsics, &H);
-      ComputeFundamentalFromCorrespondences(x1, x2, selection_intrinsics, &F);
+      ComputeHomographyFromCorrespondences(x1, x2, camera_intrinsics, &H);
+      ComputeFundamentalFromCorrespondences(x1, x2, camera_intrinsics, &F);
 
       // TODO(sergey): STEP 2: Discard outlier matches
 
@@ -377,9 +378,9 @@
       F_e.resize(x1.cols());
       for (int i = 0; i < x1.cols(); i++) {
         Vec2 current_x1 =
-          NorrmalizedToPixelSpace(Vec2(x1(0, i), x1(1, i)), selection_intrinsics);
+          NorrmalizedToPixelSpace(Vec2(x1(0, i), x1(1, i)), camera_intrinsics);
         Vec2 current_x2 =
-          NorrmalizedToPixelSpace(Vec2(x2(0, i), x2(1, i)), selection_intrinsics);
+          NorrmalizedToPixelSpace(Vec2(x2(0, i), x2(1, i)), camera_intrinsics);
 
         H_e(i) = SymmetricGeometricDistance(H, current_x1, current_x2);
         F_e(i) = SymmetricEpipolarDistance(F, current_x1, current_x2);
@@ -449,8 +450,8 @@
       reconstruction.InsertView(current_keyframe,
                                 Mat3::Identity(),
                                 Vec3::Zero(),
-                                kSelectionCamera);
-      reconstruction.InsertView(candidate_image, R, t, kSelectionCamera);
+                                camera);
+      reconstruction.InsertView(candidate_image, R, t, camera);
 
       // Reconstruct 3D points
       int intersects_total = 0, intersects_success = 0;
@@ -584,4 +585,11 @@
   }
 }
 
+void SelectKeyframesBasedOnGRICAndVariance(
+    const Tracks &tracks,
+    const std::vector<CameraIntrinsics> &intrinsics,
+    vector<int> &keyframes) {
+  SelectKeyframesBasedOnGRICAndVariance(tracks, intrinsics, 0, keyframes);
+}
+
 }  // namespace libmv

Modified: branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/keyframe_selection.h
===================================================================
--- branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/keyframe_selection.h	2013-09-12 15:30:37 UTC (rev 60078)
+++ branches/soc-2013-motion_track/extern/libmv/libmv/simple_pipeline/keyframe_selection.h	2013-09-12 16:16:08 UTC (rev 60079)
@@ -29,9 +29,9 @@
 
 namespace libmv {
 
-// Get list of all images from camera 0 which are good enough to be as keyframes
-// for camera reconstruction. Based on GRIC criteria and uses Pollefeys'
-// approach for correspondence ratio constraint.
+// Get list of all images from given camera which are good enough to be as
+// keyframes for camera reconstruction. Based on GRIC criteria and uses
+// Pollefeys' approach for correspondence ratio constraint.
 //
 // Additional criteria based on reconstruction variance are used. This means if
 // correspondence and GRIC criteria are passed, two-frame reconstruction using
@@ -50,8 +50,14 @@
 void SelectKeyframesBasedOnGRICAndVariance(
     const Tracks &tracks,
     const std::vector<CameraIntrinsics> &intrinsics,
+    int camera,
     vector<int> &keyframes);
 
+void SelectKeyframesBasedOnGRICAndVariance(
+    const Tracks &tracks,
+    const std::vector<CameraIntrinsics> &intrinsics,
+    vector<int> &keyframes);
+
 }  // namespace libmv
 
 #endif  // LIBMV_SIMPLE_PIPELINE_KEYFRAME_SELECTION_H_




More information about the Bf-blender-cvs mailing list