Skip to content

Commit cf31ad5

Browse files
author
Fabien Servant
committed
Cleanup bundle
1 parent c081e96 commit cf31ad5

File tree

3 files changed

+45
-34
lines changed

3 files changed

+45
-34
lines changed

src/aliceVision/sfm/bundle/BundleAdjustmentCeres.cpp

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

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

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 updateFromExternal(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
@@ -62,6 +62,20 @@ class Landmark
6262
{
6363
return MapObservations(_observations.begin(), _observations.end());;
6464
}
65+
66+
inline void updateFromExternal(const std::array<double, 3> & data)
67+
{
68+
// do not update a camera pose set as Ignored or Constant in the Local strategy
69+
if (state != EEstimatorParameterState::REFINED)
70+
{
71+
return;
72+
}
73+
74+
for (std::size_t i = 0; i < 3; ++i)
75+
{
76+
X(Eigen::Index(i)) = data.at(i);
77+
}
78+
}
6579

6680
private:
6781
Observations _observations;

0 commit comments

Comments
 (0)