@@ -842,8 +842,8 @@ void BundleAdjustmentCeres::resetProblem()
842842 _intrinsicsBlocks.clear ();
843843 _landmarksBlocks.clear ();
844844 _rigBlocks.clear ();
845-
846- _linearSolverOrdering. Clear ();
845+ _intrinsicObjects. clear ();
846+ _distortionsBlocks. clear ();
847847}
848848
849849void BundleAdjustmentCeres::updateFromSolution (sfmData::SfMData& sfmData, ERefineOptions refineOptions) const
@@ -859,22 +859,15 @@ void BundleAdjustmentCeres::updateFromSolution(sfmData::SfMData& sfmData, ERefin
859859 if (refinePoses)
860860 {
861861 // absolute poses
862- for (auto & posePair : sfmData.getPoses ())
862+ for (auto & [poseId, pose] : sfmData.getPoses ())
863863 {
864- const IndexT poseId = posePair.first ;
865-
866- // do not update a camera pose set as Ignored or Constant in the Local strategy
867- if (posePair.second .getState () != EEstimatorParameterState::REFINED)
864+ if (pose.getState () != EEstimatorParameterState::REFINED)
865+ {
868866 continue ;
867+ }
869868
870- const std::array<double , 6 >& poseBlock = _posesBlocks.at (poseId);
871-
872- Mat3 R_refined;
873- ceres::AngleAxisToRotationMatrix (poseBlock.data (), R_refined.data ());
874- const Vec3 t_refined (poseBlock.at (3 ), poseBlock.at (4 ), poseBlock.at (5 ));
875-
876- // update the pose
877- posePair.second .setTransform (poseFromRT (R_refined, t_refined));
869+ const std::array<double , 6 > & poseBlock = _posesBlocks.at (poseId);
870+ pose.updateFromExternal (poseBlock);
878871 }
879872
880873 // rig sub-poses
@@ -900,19 +893,17 @@ void BundleAdjustmentCeres::updateFromSolution(sfmData::SfMData& sfmData, ERefin
900893 // update camera intrinsics with refined data
901894 if (refineIntrinsics)
902895 {
903- for (const auto & intrinsicBlockPair : _intrinsicsBlocks)
896+ for (const auto & [idIntrinsic, block] : _intrinsicsBlocks)
904897 {
905- const IndexT intrinsicId = intrinsicBlockPair.first ;
906-
907- const auto & intrinsic = sfmData.getIntrinsicSharedPtr (intrinsicId);
898+ const auto & intrinsic = sfmData.getIntrinsicSharedPtr (idIntrinsic);
908899
909900 // do not update a camera pose set as Ignored or Constant in the Local strategy
910901 if (intrinsic->getState () != EEstimatorParameterState::REFINED)
911902 {
912903 continue ;
913904 }
914905
915- sfmData.getIntrinsics ().at (intrinsicId )->updateFromParams (intrinsicBlockPair. second );
906+ sfmData.getIntrinsics ().at (idIntrinsic )->updateFromParams (block );
916907 }
917908
918909 for (const auto & [idIntrinsic, distortionBlock]: _distortionsBlocks)
@@ -940,21 +931,10 @@ void BundleAdjustmentCeres::updateFromSolution(sfmData::SfMData& sfmData, ERefin
940931 // update landmarks
941932 if (refineStructure)
942933 {
943- for (const auto & landmarksBlockPair : _landmarksBlocks)
934+ for (const auto & [idLandmark, block] : _landmarksBlocks)
944935 {
945- const IndexT landmarkId = landmarksBlockPair.first ;
946- sfmData::Landmark& landmark = sfmData.getLandmarks ().at (landmarkId);
947-
948- // do not update a camera pose set as Ignored or Constant in the Local strategy
949- if (landmark.state != EEstimatorParameterState::REFINED)
950- {
951- continue ;
952- }
953-
954- for (std::size_t i = 0 ; i < 3 ; ++i)
955- {
956- landmark.X (Eigen::Index (i)) = landmarksBlockPair.second .at (i);
957- }
936+ sfmData::Landmark& landmark = sfmData.getLandmarks ().at (idLandmark);
937+ landmark.updateFromExternal (block);
958938 }
959939 }
960940}
0 commit comments