Skip to content

Commit e0b760c

Browse files
Fabien Servantmh0g
authored andcommitted
Non removable poses concept
1 parent 076b70b commit e0b760c

File tree

6 files changed

+66
-24
lines changed

6 files changed

+66
-24
lines changed

src/aliceVision/sfm/sfmFilters.cpp

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -160,56 +160,68 @@ bool eraseUnstablePoses(sfmData::SfMData& sfmData, const IndexT minPointsPerPose
160160
// Count the observation poses occurrence
161161
std::map<IndexT, IndexT> posesCount;
162162

163-
// Init with 0 count, undefined rig id (in order to be able to remove non referenced elements)
164-
for (sfmData::Poses::const_iterator itPoses = sfmData.getPoses().begin(); itPoses != sfmData.getPoses().end(); ++itPoses)
165-
posesCount[itPoses->first] = 0;
163+
// Loop over all poses
164+
for (auto & [poseId, pose] : sfmData.getPoses())
165+
{
166+
if (!pose.isRemovable())
167+
{
168+
continue;
169+
}
170+
171+
posesCount[poseId] = 0;
172+
}
166173

167174
// Count occurrence of the poses in the Landmark observations
168-
for (sfmData::Landmarks::const_iterator itLandmarks = landmarks.begin(); itLandmarks != landmarks.end(); ++itLandmarks)
175+
for (const auto & [idLandmark, landmark] : landmarks)
169176
{
170-
const sfmData::Observations& observations = itLandmarks->second.getObservations();
171-
for (sfmData::Observations::const_iterator itObs = observations.begin(); itObs != observations.end(); ++itObs)
172-
{
173-
const IndexT viewId = itObs->first;
174-
const sfmData::View* v = sfmData.getViews().at(viewId).get();
175-
const auto poseInfoIt = posesCount.find(v->getPoseId());
177+
const sfmData::Observations& observations = landmark.getObservations();
176178

179+
for (const auto & [viewId, obs] : observations)
180+
{
181+
const sfmData::View & v = sfmData.getView(viewId);
182+
183+
const auto poseInfoIt = posesCount.find(v.getPoseId());
177184
if (poseInfoIt != posesCount.end())
185+
{
178186
poseInfoIt->second++;
179-
else // all pose should be defined in map_PoseId_Count
180-
throw std::runtime_error(std::string("eraseUnstablePoses: found unknown pose id referenced by a view.\n\t- view id: ") +
181-
std::to_string(v->getViewId()) + std::string("\n\t- pose id: ") + std::to_string(v->getPoseId()));
187+
}
182188
}
183189
}
184190

185191
// If usage count is smaller than the threshold, remove the Pose
186-
for (std::map<IndexT, IndexT>::const_iterator it = posesCount.begin(); it != posesCount.end(); ++it)
192+
for (const auto & [idPose, count] : posesCount)
187193
{
188-
if (it->second < minPointsPerPose)
194+
if (count < minPointsPerPose)
189195
{
190-
sfmData.erasePose(it->first, true); // no throw
196+
sfmData.erasePose(idPose, true); // no throw
191197

192-
for (auto& viewPair : sfmData.getViews())
198+
for (auto& [viewId, view] : sfmData.getViews())
193199
{
194-
if (viewPair.second->getPoseId() == it->first)
200+
if (view->getPoseId() == idPose)
195201
{
196-
if (viewPair.second->isPartOfRig())
202+
if (view->isPartOfRig())
197203
{
198-
// the pose is now independent
199-
viewPair.second->setPoseId(viewPair.first);
200-
viewPair.second->setIndependantPose(true);
204+
// the pose is now independant
205+
view->setPoseId(idPose);
206+
view->setIndependantPose(true);
201207
}
202208

203209
// add view id to the removedViewsId set
204210
if (outRemovedViewsId != NULL)
205-
outRemovedViewsId->insert(viewPair.first);
211+
{
212+
outRemovedViewsId->insert(viewId);
213+
}
206214
}
207215
}
208216
++removedElements;
209217
}
210218
}
219+
211220
if (removedElements)
221+
{
212222
ALICEVISION_LOG_DEBUG("eraseUnstablePoses: " << removedElements);
223+
}
224+
213225
return removedElements > 0;
214226
}
215227

src/aliceVision/sfmData/CameraPose.hpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,33 @@ class CameraPose
9393
_rotationOnly = partial;
9494
}
9595

96+
/**
97+
* @brief Can this pose be removed from sfmdata given heuristics ?
98+
* @param removable true if it can be removed normally
99+
*/
100+
void setRemovable(bool removable)
101+
{
102+
_removable = removable;
103+
}
104+
105+
/**
106+
* @brief Can this pose be removed from sfmdata given heuristics ?
107+
* @return true if it can be removed normally
108+
*/
109+
bool isRemovable() const
110+
{
111+
return _removable;
112+
}
113+
96114
private:
97115
/// camera 3d transformation
98116
geometry::Pose3 _transform;
99117
/// camera lock
100118
bool _locked = false;
101119
/// Only rotation is solved
102120
bool _rotationOnly = false;
121+
/// Can be removed
122+
bool _removable = true;
103123
/// Estimator state
104124
EEstimatorParameterState _state = EEstimatorParameterState::REFINED;
105125
};

src/aliceVision/sfmDataIO/AlembicExporter.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ void AlembicExporter::DataImpl::addCamera(const std::string& name,
112112
{
113113
OBoolProperty(userProps, "mvg_poseLocked").set(pose->isLocked());
114114
OBoolProperty(userProps, "mvg_rotationOnly").set(pose->isRotationOnly());
115+
OBoolProperty(userProps, "mvg_removable").set(pose->isRemovable());
115116

116117
// Convert from computer vision convention to computer graphics (opengl-like)
117118
Eigen::Matrix4d M = Eigen::Matrix4d::Identity();

src/aliceVision/sfmDataIO/AlembicImporter.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,7 @@ bool readCamera(const Version& abcVersion,
418418
bool intrinsicLocked = false;
419419
bool poseLocked = false;
420420
bool rotationOnly = false;
421+
bool removable = true;
421422
bool poseIndependant = true;
422423
bool lockRatio = true;
423424
bool lockOffset = false;
@@ -495,6 +496,10 @@ bool readCamera(const Version& abcVersion,
495496
{
496497
rotationOnly = getAbcProp<Alembic::Abc::IBoolProperty>(userProps, *propHeader, "mvg_rotationOnly", sampleFrame);
497498
}
499+
if (const Alembic::Abc::PropertyHeader* propHeader = userProps.getPropertyHeader("mvg_removable"))
500+
{
501+
removable = getAbcProp<Alembic::Abc::IBoolProperty>(userProps, *propHeader, "mvg_removable", sampleFrame);
502+
}
498503
if (const Alembic::Abc::PropertyHeader* propHeader = userProps.getPropertyHeader("mvg_poseIndependant"))
499504
{
500505
poseIndependant = getAbcProp<Alembic::Abc::IBoolProperty>(userProps, *propHeader, "mvg_poseIndependant", sampleFrame);
@@ -818,6 +823,7 @@ bool readCamera(const Version& abcVersion,
818823
{
819824
sfmData::CameraPose cp(pose, poseLocked);
820825
cp.setRotationOnly(rotationOnly);
826+
cp.setRemovable(removable);
821827
sfmData.setPose(*view, cp);
822828
}
823829
}

src/aliceVision/sfmDataIO/jsonIO.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ inline void saveCameraPose(const std::string& name, const sfmData::CameraPose& c
107107
savePose3("transform", cameraPose.getTransform(), cameraPoseTree);
108108
cameraPoseTree.put("locked", cameraPose.isLocked());
109109
cameraPoseTree.put("rotationOnly", cameraPose.isRotationOnly());
110+
cameraPoseTree.put("removable", cameraPose.isRemovable());
110111
parentTree.add_child(name, cameraPoseTree);
111112
}
112113

@@ -135,7 +136,8 @@ inline void loadCameraPose(const std::string& name, sfmData::CameraPose& cameraP
135136
cameraPose.unlock();
136137
}
137138

138-
poseTree.get<bool>("rotationOnly", false);
139+
cameraPose.setRotationOnly(poseTree.get<bool>("rotationOnly", false));
140+
cameraPose.setRemovable(poseTree.get<bool>("removable", false));
139141
}
140142

141143
/**

src/software/utils/main_sfmPoseInjecting.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@ int aliceVision_main(int argc, char** argv)
228228
{
229229
geometry::Pose3 pose(rpose.T);
230230
sfmData::CameraPose cpose(pose, false);
231+
cpose.setRemovable(false);
231232
sfmData.setAbsolutePose(id, cpose);
232233
}
233234
}

0 commit comments

Comments
 (0)