diff --git a/src/aliceVision/localization/optimization.cpp b/src/aliceVision/localization/optimization.cpp index c45d0669f6..32478583df 100644 --- a/src/aliceVision/localization/optimization.cpp +++ b/src/aliceVision/localization/optimization.cpp @@ -236,10 +236,8 @@ bool refineSequence(std::vector& vec_localizationResult, // just debugging stuff if (allTheSameIntrinsics) { - std::vector params = tinyScene.getIntrinsics().at(0).get()->getParameters(); + std::vector params = tinyScene.getIntrinsics().at(0)->getParameters(); ALICEVISION_LOG_DEBUG("K before bundle: " << params[0] << " " << params[1] << " " << params[2]); - if (params.size() == 6) - ALICEVISION_LOG_DEBUG("Distortion before bundle: " << params[3] << " " << params[4] << " " << params[5]); } } @@ -302,20 +300,19 @@ bool refineSequence(std::vector& vec_localizationResult, // if we used the same intrinsics for all the localization results we need to // update the intrinsics of each localization result - // get its optimized parameters - std::vector params = tinyScene.getIntrinsics().at(0).get()->getParameters(); - ALICEVISION_LOG_DEBUG("Type of intrinsics " << tinyScene.getIntrinsics().at(0).get()->getType()); - if (params.size() == 4) + auto intrinsic = tinyScene.getIntrinsics().at(0); + auto casted = camera::IntrinsicScaleOffsetDisto::cast(intrinsic); + std::shared_ptr distortion; + if (casted) { - // this means that the b_no_distortion has been passed - // set distortion to 0 - params.push_back(0); - params.push_back(0); - params.push_back(0); + distortion = casted->getDistortion(); } - assert(params.size() == 6); + + // get its optimized parameters + std::vector params = intrinsic->getParameters(); + + ALICEVISION_LOG_DEBUG("Type of intrinsics " << intrinsic->getType()); ALICEVISION_LOG_DEBUG("K after bundle: " << params[0] << " " << params[1] << " " << params[2] << " " << params[3]); - ALICEVISION_LOG_DEBUG("Distortion after bundle " << params[4] << " " << params[5] << " " << params[6]); // update the intrinsics of the each localization result for (size_t viewID = 0; viewID < numViews; ++viewID) @@ -327,6 +324,13 @@ bool refineSequence(std::vector& vec_localizationResult, } currResult.updateIntrinsics(params); + auto curDistortion = currResult.getIntrinsics().getDistortion(); + if (distortion && curDistortion) + { + curDistortion->setParameters(distortion->getParameters()); + } + + // just debugging -- print reprojection errors const Mat2X residuals = currResult.computeInliersResiduals(); diff --git a/src/aliceVision/rig/ResidualError.hpp b/src/aliceVision/rig/ResidualError.hpp index de38c29919..166b397b38 100644 --- a/src/aliceVision/rig/ResidualError.hpp +++ b/src/aliceVision/rig/ResidualError.hpp @@ -260,9 +260,9 @@ class ResidualErrorSecondaryCameraFixedRelativeFunctor _K = intrinsics.K(); _params.reserve(3); - _params.push_back(intrinsics.getParameters()[3]); - _params.push_back(intrinsics.getParameters()[4]); - _params.push_back(intrinsics.getParameters()[5]); + _params.push_back(intrinsics.getDistortion()->getParameters()[0]); + _params.push_back(intrinsics.getDistortion()->getParameters()[1]); + _params.push_back(intrinsics.getDistortion()->getParameters()[2]); // Set the observation _observation[0] = pt2d[0]; diff --git a/src/aliceVision/sfm/bundle/costfunctions/projection.hpp b/src/aliceVision/sfm/bundle/costfunctions/projection.hpp index a82d67d0bd..e08f2c900c 100644 --- a/src/aliceVision/sfm/bundle/costfunctions/projection.hpp +++ b/src/aliceVision/sfm/bundle/costfunctions/projection.hpp @@ -105,7 +105,7 @@ struct ProjectionErrorFunctor transformedPoint[2] += cam_t[2]; } - const T * innerParameters[2]; + const T * innerParameters[3]; innerParameters[0] = parameter_intrinsics; innerParameters[1] = parameter_distortion; innerParameters[2] = transformedPoint;