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.
This commit is contained in:
Sergey Sharybin 2019-07-23 14:50:50 +02:00
parent 361d578f9d
commit 7d65827980
Notes: blender-bot 2023-02-14 01:45:58 +01:00
Referenced by issue #67089, Solve camera motion generates "Solve error: nan"
1 changed files with 14 additions and 9 deletions

View 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,