@@ -816,7 +816,8 @@ void BundleAdjustmentCeres::resetProblem()
816816 _intrinsicsBlocks.clear ();
817817 _landmarksBlocks.clear ();
818818 _rigBlocks.clear ();
819-
819+ _intrinsicObjects.clear ();
820+ _distortionsBlocks.clear ();
820821 _linearSolverOrdering.Clear ();
821822}
822823
@@ -833,22 +834,15 @@ void BundleAdjustmentCeres::updateFromSolution(sfmData::SfMData& sfmData, ERefin
833834 if (refinePoses)
834835 {
835836 // absolute poses
836- for (auto & posePair : sfmData.getPoses ())
837+ for (auto & [poseId, pose] : sfmData.getPoses ())
837838 {
838- const IndexT poseId = posePair.first ;
839-
840- // do not update a camera pose set as Ignored or Constant in the Local strategy
841- if (posePair.second .getState () != EEstimatorParameterState::REFINED)
839+ if (pose.getState () != EEstimatorParameterState::REFINED)
840+ {
842841 continue ;
842+ }
843843
844- const std::array<double , 6 >& poseBlock = _posesBlocks.at (poseId);
845-
846- Mat3 R_refined;
847- ceres::AngleAxisToRotationMatrix (poseBlock.data (), R_refined.data ());
848- const Vec3 t_refined (poseBlock.at (3 ), poseBlock.at (4 ), poseBlock.at (5 ));
849-
850- // update the pose
851- posePair.second .setTransform (poseFromRT (R_refined, t_refined));
844+ const std::array<double , 6 > & poseBlock = _posesBlocks.at (poseId);
845+ pose.updateFromEstimator (poseBlock);
852846 }
853847
854848 // rig sub-poses
@@ -874,19 +868,17 @@ void BundleAdjustmentCeres::updateFromSolution(sfmData::SfMData& sfmData, ERefin
874868 // update camera intrinsics with refined data
875869 if (refineIntrinsics)
876870 {
877- for (const auto & intrinsicBlockPair : _intrinsicsBlocks)
871+ for (const auto & [idIntrinsic, block] : _intrinsicsBlocks)
878872 {
879- const IndexT intrinsicId = intrinsicBlockPair.first ;
880-
881- const auto & intrinsic = sfmData.getIntrinsicSharedPtr (intrinsicId);
873+ const auto & intrinsic = sfmData.getIntrinsicSharedPtr (idIntrinsic);
882874
883875 // do not update a camera pose set as Ignored or Constant in the Local strategy
884876 if (intrinsic->getState () != EEstimatorParameterState::REFINED)
885877 {
886878 continue ;
887879 }
888880
889- sfmData.getIntrinsics ().at (intrinsicId )->updateFromParams (intrinsicBlockPair. second );
881+ sfmData.getIntrinsics ().at (idIntrinsic )->updateFromParams (block );
890882 }
891883
892884 for (const auto & [idIntrinsic, distortionBlock]: _distortionsBlocks)
@@ -914,21 +906,10 @@ void BundleAdjustmentCeres::updateFromSolution(sfmData::SfMData& sfmData, ERefin
914906 // update landmarks
915907 if (refineStructure)
916908 {
917- for (const auto & landmarksBlockPair : _landmarksBlocks)
909+ for (const auto & [idLandmark, block] : _landmarksBlocks)
918910 {
919- const IndexT landmarkId = landmarksBlockPair.first ;
920- sfmData::Landmark& landmark = sfmData.getLandmarks ().at (landmarkId);
921-
922- // do not update a camera pose set as Ignored or Constant in the Local strategy
923- if (landmark.state != EEstimatorParameterState::REFINED)
924- {
925- continue ;
926- }
927-
928- for (std::size_t i = 0 ; i < 3 ; ++i)
929- {
930- landmark.X (Eigen::Index (i)) = landmarksBlockPair.second .at (i);
931- }
911+ sfmData::Landmark& landmark = sfmData.getLandmarks ().at (idLandmark);
912+ landmark.updateFromEstimator (block);
932913 }
933914 }
934915}
0 commit comments