@@ -815,8 +815,8 @@ void BundleAdjustmentCeres::resetProblem()
815815 _intrinsicsBlocks.clear ();
816816 _landmarksBlocks.clear ();
817817 _rigBlocks.clear ();
818-
819- _linearSolverOrdering. Clear ();
818+ _intrinsicObjects. clear ();
819+ _distortionsBlocks. clear ();
820820}
821821
822822void BundleAdjustmentCeres::updateFromSolution (sfmData::SfMData& sfmData, ERefineOptions refineOptions) const
@@ -832,22 +832,15 @@ void BundleAdjustmentCeres::updateFromSolution(sfmData::SfMData& sfmData, ERefin
832832 if (refinePoses)
833833 {
834834 // absolute poses
835- for (auto & posePair : sfmData.getPoses ())
835+ for (auto & [poseId, pose] : sfmData.getPoses ())
836836 {
837- const IndexT poseId = posePair.first ;
838-
839- // do not update a camera pose set as Ignored or Constant in the Local strategy
840- if (posePair.second .getState () != EEstimatorParameterState::REFINED )
837+ if (pose.getState () != EEstimatorParameterState::REFINED )
838+ {
841839 continue ;
840+ }
842841
843- const std::array<double , 6 >& poseBlock = _posesBlocks.at (poseId);
844-
845- Mat3 R_refined;
846- ceres::AngleAxisToRotationMatrix (poseBlock.data (), R_refined.data ());
847- const Vec3 t_refined (poseBlock.at (3 ), poseBlock.at (4 ), poseBlock.at (5 ));
848-
849- // update the pose
850- posePair.second .setTransform (poseFromRT (R_refined, t_refined));
842+ const std::array<double , 6 > & poseBlock = _posesBlocks.at (poseId);
843+ pose.updateFromEstimator (poseBlock);
851844 }
852845
853846 // rig sub-poses
@@ -873,19 +866,17 @@ void BundleAdjustmentCeres::updateFromSolution(sfmData::SfMData& sfmData, ERefin
873866 // update camera intrinsics with refined data
874867 if (refineIntrinsics)
875868 {
876- for (const auto & intrinsicBlockPair : _intrinsicsBlocks)
869+ for (const auto & [idIntrinsic, block] : _intrinsicsBlocks)
877870 {
878- const IndexT intrinsicId = intrinsicBlockPair.first ;
879-
880- const auto & intrinsic = sfmData.getIntrinsicSharedPtr (intrinsicId);
871+ const auto & intrinsic = sfmData.getIntrinsicSharedPtr (idIntrinsic);
881872
882873 // do not update a camera pose set as Ignored or Constant in the Local strategy
883874 if (intrinsic->getState () != EEstimatorParameterState::REFINED )
884875 {
885876 continue ;
886877 }
887878
888- sfmData.getIntrinsics ().at (intrinsicId )->updateFromParams (intrinsicBlockPair. second );
879+ sfmData.getIntrinsics ().at (idIntrinsic )->updateFromParams (block );
889880 }
890881
891882 for (const auto & [idIntrinsic, distortionBlock]: _distortionsBlocks)
@@ -913,21 +904,10 @@ void BundleAdjustmentCeres::updateFromSolution(sfmData::SfMData& sfmData, ERefin
913904 // update landmarks
914905 if (refineStructure)
915906 {
916- for (const auto & landmarksBlockPair : _landmarksBlocks)
907+ for (const auto & [idLandmark, block] : _landmarksBlocks)
917908 {
918- const IndexT landmarkId = landmarksBlockPair.first ;
919- sfmData::Landmark& landmark = sfmData.getLandmarks ().at (landmarkId);
920-
921- // do not update a camera pose set as Ignored or Constant in the Local strategy
922- if (landmark.state != EEstimatorParameterState::REFINED )
923- {
924- continue ;
925- }
926-
927- for (std::size_t i = 0 ; i < 3 ; ++i)
928- {
929- landmark.X (Eigen::Index (i)) = landmarksBlockPair.second .at (i);
930- }
909+ sfmData::Landmark& landmark = sfmData.getLandmarks ().at (idLandmark);
910+ landmark.updateFromEstimator (block);
931911 }
932912 }
933913}
0 commit comments