Fix T67089: Solve camera motion generates "Solve error: nan"
authorSergey Sharybin <sergey.vfx@gmail.com>
Tue, 23 Jul 2019 12:50:50 +0000 (14:50 +0200)
committerSergey Sharybin <sergey.vfx@gmail.com>
Tue, 23 Jul 2019 13:12:35 +0000 (15:12 +0200)
The code was missing some checks for whether keyframe selection
went successfully and whether reconstruction has been successfully
initialized.

The interface still gives quite generic message, with the details
printed to the console. This can be addressed separately.

intern/libmv/intern/reconstruction.cc

index e271d663c4a5b820e9b954969d36c48a229a5dfb..64f00b19df0e28bed0b4ca1b4c4c76ef9c39bfb2 100644 (file)
@@ -264,15 +264,15 @@ libmv_Reconstruction *libmv_solveReconstruction(
 
     update_callback.invoke(0, "Selecting keyframes");
 
-    selectTwoKeyframesBasedOnGRICAndVariance(tracks,
+    if (selectTwoKeyframesBasedOnGRICAndVariance(tracks,
                                              normalized_tracks,
                                              *camera_intrinsics,
                                              keyframe1,
-                                             keyframe2);
-
-    /* so keyframes in the interface would be updated */
-    libmv_reconstruction_options->keyframe1 = keyframe1;
-    libmv_reconstruction_options->keyframe2 = keyframe2;
+                                             keyframe2)) {
+      /* so keyframes in the interface would be updated */
+      libmv_reconstruction_options->keyframe1 = keyframe1;
+      libmv_reconstruction_options->keyframe2 = keyframe2;
+    }
   }
 
   /* Actual reconstruction. */
@@ -283,7 +283,7 @@ libmv_Reconstruction *libmv_solveReconstruction(
 
   LG << "number of markers for init: " << keyframe_markers.size();
 
-  if (keyframe_markers.size() < 8) {
+  if (keyframe_markers.size() < 16) {
     LG << "No enough markers to initialize from";
     libmv_reconstruction->is_valid = false;
     return libmv_reconstruction;
@@ -291,13 +291,18 @@ libmv_Reconstruction *libmv_solveReconstruction(
 
   update_callback.invoke(0, "Initial reconstruction");
 
-  EuclideanReconstructTwoFrames(keyframe_markers, &reconstruction);
+  if (!EuclideanReconstructTwoFrames(keyframe_markers, &reconstruction)) {
+    LG << "Failed to initialize reconstruction";
+    libmv_reconstruction->is_valid = false;
+    return libmv_reconstruction;
+  }
+
   EuclideanBundle(normalized_tracks, &reconstruction);
   EuclideanCompleteReconstruction(normalized_tracks,
                                   &reconstruction,
                                   &update_callback);
 
-  /* Refinement/ */
+  /* Refinement. */
   if (libmv_reconstruction_options->refine_intrinsics) {
     libmv_solveRefineIntrinsics(
                                 tracks,