Skip to content

Commit 7ef8448

Browse files
Fabien Servantservantftransperfect
authored andcommitted
Cleanup bundle
1 parent cf23722 commit 7ef8448

File tree

3 files changed

+45
-33
lines changed

3 files changed

+45
-33
lines changed

src/aliceVision/sfm/bundle/BundleAdjustmentCeres.cpp

Lines changed: 14 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

src/aliceVision/sfmData/CameraPose.hpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,23 @@ class CameraPose
111111
return _removable;
112112
}
113113

114+
inline void updateFromEstimator(const std::array<double, 6> & data)
115+
{
116+
// do not update a camera pose set as Ignored or Constant in the Local strategy
117+
if (getState() != EEstimatorParameterState::REFINED)
118+
{
119+
return;
120+
}
121+
122+
const Vec3 r_refined(data.at(0), data.at(1), data.at(2));
123+
const Vec3 t_refined(data.at(3), data.at(4), data.at(5));
124+
125+
const Mat3 R_refined = SO3::expm(r_refined);
126+
127+
// update the pose
128+
setTransform(geometry::poseFromRT(R_refined, t_refined));
129+
}
130+
114131
private:
115132
/// camera 3d transformation
116133
geometry::Pose3 _transform;

src/aliceVision/sfmData/Landmark.hpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,20 @@ class Landmark
5858
{
5959
return MapObservations(_observations.begin(), _observations.end());;
6060
}
61+
62+
inline void updateFromEstimator(const std::array<double, 3> & data)
63+
{
64+
// do not update a landmark set as Ignored or Constant in the Local strategy
65+
if (state != EEstimatorParameterState::REFINED)
66+
{
67+
return;
68+
}
69+
70+
for (std::size_t i = 0; i < 3; ++i)
71+
{
72+
X(Eigen::Index(i)) = data.at(i);
73+
}
74+
}
6175

6276
private:
6377
Observations _observations;

0 commit comments

Comments
 (0)