[Bf-blender-cvs] [7d65827980e] master: Fix T67089: Solve camera motion generates "Solve error: nan"

Sergey Sharybin noreply at git.blender.org
Tue Jul 23 15:17:57 CEST 2019


Commit: 7d65827980e72750d0c58de9e6865e8d32a7a90c
Author: Sergey Sharybin
Date:   Tue Jul 23 14:50:50 2019 +0200
Branches: master
https://developer.blender.org/rB7d65827980e72750d0c58de9e6865e8d32a7a90c

Fix T67089: Solve camera motion generates "Solve error: nan"

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.

===================================================================

M	intern/libmv/intern/reconstruction.cc

===================================================================

diff --git a/intern/libmv/intern/reconstruction.cc b/intern/libmv/intern/reconstruction.cc
index e271d663c4a..64f00b19df0 100644
--- a/intern/libmv/intern/reconstruction.cc
+++ b/intern/libmv/intern/reconstruction.cc
@@ -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,



More information about the Bf-blender-cvs mailing list