Skip to content

Commit 0550b06

Browse files
Cleanup bundle
1 parent c8925f5 commit 0550b06

3 files changed

Lines changed: 45 additions & 34 deletions

File tree

src/aliceVision/sfm/bundle/BundleAdjustmentCeres.cpp

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

822822
void 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
}

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 camera pose 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)