Skip to content

Commit 8801a6a

Browse files
authored
Merge pull request #1773 from alicevision/dev/globalRotation
Add global rotation estimation app
2 parents 303ff47 + 50b9d7a commit 8801a6a

20 files changed

+140420
-20
lines changed

src/aliceVision/mvsUtils/MultiViewParams.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ MultiViewParams::MultiViewParams(const sfmData::SfMData& sfmData,
5858
{
5959
const sfmData::View& view = *(viewPair.second.get());
6060

61-
if (!sfmData.isPoseAndIntrinsicDefined(&view))
61+
if (!sfmData.isPoseAndIntrinsicDefined(view))
6262
continue;
6363

6464
std::string path = view.getImage().getImagePath();

src/aliceVision/sfm/bundle/BundleAdjustmentCeres.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ void BundleAdjustmentCeres::addIntrinsicsToProblem(const sfmData::SfMData& sfmDa
422422
if (intrinsicsUsage.find(view.getIntrinsicId()) == intrinsicsUsage.end())
423423
intrinsicsUsage[view.getIntrinsicId()] = 0;
424424

425-
if (sfmData.isPoseAndIntrinsicDefined(&view))
425+
if (sfmData.isPoseAndIntrinsicDefined(view))
426426
++intrinsicsUsage.at(view.getIntrinsicId());
427427
}
428428

src/aliceVision/sfm/pipeline/relativePoses.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <aliceVision/numeric/numeric.hpp>
99
#include <aliceVision/dataio/json.hpp>
1010
#include <aliceVision/geometry/lie.hpp>
11+
#include <aliceVision/geometry/Pose3.hpp>
1112

1213
namespace aliceVision {
1314
namespace sfm {

src/aliceVision/sfm/utils/alignment.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -762,7 +762,7 @@ void computeNewCoordinateSystemFromCamerasXAxis(const sfmData::SfMData& sfmData,
762762
{
763763
const sfmData::View& view = *viewIt.second.get();
764764

765-
if (sfmData.isPoseAndIntrinsicDefined(&view))
765+
if (sfmData.isPoseAndIntrinsicDefined(view))
766766
{
767767
const sfmData::EEXIFOrientation orientation = view.getImage().getMetadataOrientation();
768768
const sfmData::CameraPose camPose = sfmData.getPose(view);
@@ -804,7 +804,7 @@ void computeNewCoordinateSystemFromCamerasXAxis(const sfmData::SfMData& sfmData,
804804
{
805805
const sfmData::View& view = *viewIt.second.get();
806806

807-
if (sfmData.isPoseAndIntrinsicDefined(&view))
807+
if (sfmData.isPoseAndIntrinsicDefined(view))
808808
{
809809
const sfmData::EEXIFOrientation orientation = view.getImage().getMetadataOrientation();
810810
const sfmData::CameraPose camPose = sfmData.getPose(view);
@@ -1010,7 +1010,7 @@ IndexT getCenterCameraView(const sfmData::SfMData& sfmData)
10101010
for (auto& viewIt : sfmData.getViews())
10111011
{
10121012
const sfmData::View& v = *viewIt.second;
1013-
if (!sfmData.isPoseAndIntrinsicDefined(&v))
1013+
if (!sfmData.isPoseAndIntrinsicDefined(v))
10141014
continue;
10151015
const auto& pose = sfmData.getPose(v);
10161016
const double dist = (pose.getTransform().center() - camerasCenter).norm();

src/aliceVision/sfmData/CameraPose.hpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,27 @@ class CameraPose
7979

8080
void setState(EEstimatorParameterState state) { _state = state; }
8181

82+
bool isRotationOnly() const
83+
{
84+
return _rotationOnly;
85+
}
86+
87+
/**
88+
* Set the flag for partial state
89+
* Partial flag set to on means the camera translation is not known
90+
*/
91+
void setRotationOnly(bool partial)
92+
{
93+
_rotationOnly = partial;
94+
}
95+
8296
private:
8397
/// camera 3d transformation
8498
geometry::Pose3 _transform;
8599
/// camera lock
86100
bool _locked = false;
101+
/// Only rotation is solved
102+
bool _rotationOnly = false;
87103
/// Estimator state
88104
EEstimatorParameterState _state = EEstimatorParameterState::REFINED;
89105
};

src/aliceVision/sfmData/SfMData.hpp

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,50 @@ class SfMData
280280
return isIntrinsicDefined(*_views.at(viewId));
281281
}
282282

283+
/**
284+
* @brief Check if the given view have defined intrinsi
285+
* @param[in] view The given view
286+
* @return true if intrinsic and pose defined
287+
*/
288+
bool isPoseAndIntrinsicDefined(const View & view) const
289+
{
290+
const IndexT poseId = view.getPoseId();
291+
if (poseId == UndefinedIndexT)
292+
{
293+
return false;
294+
}
295+
296+
const IndexT intrinsicId = view.getIntrinsicId();
297+
if (intrinsicId == UndefinedIndexT)
298+
{
299+
return false;
300+
}
301+
302+
if (_intrinsics.find(view.getIntrinsicId()) == _intrinsics.end())
303+
{
304+
return false;
305+
}
306+
307+
auto it = _poses.find(poseId);
308+
if (it == _poses.end())
309+
{
310+
return false;
311+
}
312+
313+
if (it->second.isRotationOnly())
314+
{
315+
return false;
316+
}
317+
318+
bool rigValid = ((!view.isPartOfRig() || view.isPoseIndependant() || getRigSubPose(view).status != ERigSubPoseStatus::UNINITIALIZED));
319+
if (!rigValid)
320+
{
321+
return false;
322+
}
323+
324+
return true;
325+
}
326+
283327
/**
284328
* @brief Check if the given view have defined intrinsi
285329
* @param[in] view The given view
@@ -288,10 +332,11 @@ class SfMData
288332
bool isPoseAndIntrinsicDefined(const View* view) const
289333
{
290334
if (view == nullptr)
335+
{
291336
return false;
292-
return (view->getIntrinsicId() != UndefinedIndexT && view->getPoseId() != UndefinedIndexT &&
293-
(!view->isPartOfRig() || view->isPoseIndependant() || getRigSubPose(*view).status != ERigSubPoseStatus::UNINITIALIZED) &&
294-
_intrinsics.find(view->getIntrinsicId()) != _intrinsics.end() && _poses.find(view->getPoseId()) != _poses.end());
337+
}
338+
339+
return isPoseAndIntrinsicDefined(*view);
295340
}
296341

297342
/**

src/aliceVision/sfmDataIO/AlembicExporter.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ void AlembicExporter::DataImpl::addCamera(const std::string& name,
111111
if (pose != nullptr)
112112
{
113113
OBoolProperty(userProps, "mvg_poseLocked").set(pose->isLocked());
114+
OBoolProperty(userProps, "mvg_rotationOnly").set(pose->isRotationOnly());
114115

115116
// Convert from computer vision convention to computer graphics (opengl-like)
116117
Eigen::Matrix4d M = Eigen::Matrix4d::Identity();
@@ -397,7 +398,7 @@ void AlembicExporter::addSfMSingleCamera(const sfmData::SfMData& sfmData, const
397398
const std::shared_ptr<camera::IntrinsicBase> intrinsic =
398399
(flagsPart & ESfMData::INTRINSICS) ? sfmData.getIntrinsicSharedPtr(view.getIntrinsicId()) : nullptr;
399400

400-
if (sfmData.isPoseAndIntrinsicDefined(&view) && (flagsPart & ESfMData::EXTRINSICS))
401+
if (sfmData.isPoseAndIntrinsicDefined(view) && (flagsPart & ESfMData::EXTRINSICS))
401402
_dataImpl->addCamera(name, view, pose, intrinsic, nullptr, &_dataImpl->_mvgCameras);
402403
else
403404
_dataImpl->addCamera(name, view, pose, intrinsic, nullptr, &_dataImpl->_mvgCamerasUndefined);

src/aliceVision/sfmDataIO/AlembicImporter.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,7 @@ bool readCamera(const Version& abcVersion,
417417
IndexT resectionId = UndefinedIndexT;
418418
bool intrinsicLocked = false;
419419
bool poseLocked = false;
420+
bool rotationOnly = false;
420421
bool poseIndependant = true;
421422
bool lockRatio = true;
422423
bool lockOffset = false;
@@ -489,6 +490,10 @@ bool readCamera(const Version& abcVersion,
489490
{
490491
poseLocked = getAbcProp<Alembic::Abc::IBoolProperty>(userProps, *propHeader, "mvg_poseLocked", sampleFrame);
491492
}
493+
if (const Alembic::Abc::PropertyHeader* propHeader = userProps.getPropertyHeader("mvg_rotationOnly"))
494+
{
495+
rotationOnly = getAbcProp<Alembic::Abc::IBoolProperty>(userProps, *propHeader, "mvg_rotationOnly", sampleFrame);
496+
}
492497
if (const Alembic::Abc::PropertyHeader* propHeader = userProps.getPropertyHeader("mvg_poseIndependant"))
493498
{
494499
poseIndependant = getAbcProp<Alembic::Abc::IBoolProperty>(userProps, *propHeader, "mvg_poseIndependant", sampleFrame);
@@ -805,7 +810,9 @@ bool readCamera(const Version& abcVersion,
805810
}
806811
else
807812
{
808-
sfmData.setPose(*view, sfmData::CameraPose(pose, poseLocked));
813+
sfmData::CameraPose cp(pose, poseLocked);
814+
cp.setRotationOnly(rotationOnly);
815+
sfmData.setPose(*view, cp);
809816
}
810817
}
811818

429 KB
Binary file not shown.

0 commit comments

Comments
 (0)