AliceVision
Photogrammetric Computer Vision Framework
Rig.hpp
1 // This file is part of the AliceVision project.
2 // Copyright (c) 2017 AliceVision contributors.
3 // This Source Code Form is subject to the terms of the Mozilla Public License,
4 // v. 2.0. If a copy of the MPL was not distributed with this file,
5 // You can obtain one at https://mozilla.org/MPL/2.0/.
6 
7 #pragma once
8 
9 #include <aliceVision/types.hpp>
10 #include <aliceVision/geometry/Pose3.hpp>
11 
12 #include <vector>
13 #include <cassert>
14 #include <algorithm>
15 #include <stdexcept>
16 
17 namespace aliceVision {
18 namespace sfmData {
19 
23 enum class ERigSubPoseStatus : std::uint8_t
24 {
25  UNINITIALIZED = 0,
26  ESTIMATED = 1,
27  CONSTANT = 2
28 };
29 
35 inline std::string ERigSubPoseStatus_enumToString(ERigSubPoseStatus rigSubPoseStatus)
36 {
37  switch (rigSubPoseStatus)
38  {
39  case ERigSubPoseStatus::UNINITIALIZED:
40  return "uninitialized";
41  case ERigSubPoseStatus::ESTIMATED:
42  return "estimated";
43  case ERigSubPoseStatus::CONSTANT:
44  return "constant";
45  }
46  throw std::out_of_range("Invalid rigSubPoseStatus enum");
47 }
48 
54 inline ERigSubPoseStatus ERigSubPoseStatus_stringToEnum(const std::string& rigSubPoseStatus)
55 {
56  std::string status = rigSubPoseStatus;
57  std::transform(status.begin(), status.end(), status.begin(), ::tolower); // tolower
58 
59  if (status == "uninitialized")
60  return ERigSubPoseStatus::UNINITIALIZED;
61  if (status == "estimated")
62  return ERigSubPoseStatus::ESTIMATED;
63  if (status == "constant")
64  return ERigSubPoseStatus::CONSTANT;
65 
66  throw std::out_of_range("Invalid rigSubPoseStatus : " + rigSubPoseStatus);
67 }
68 
69 struct RigSubPose
70 {
72  ERigSubPoseStatus status = ERigSubPoseStatus::UNINITIALIZED;
75 
81  RigSubPose(const geometry::Pose3& pose = geometry::Pose3(), ERigSubPoseStatus status = ERigSubPoseStatus::UNINITIALIZED)
82  : pose(pose),
83  status(status)
84  {}
85 
91  bool operator==(const RigSubPose& other) const { return (status == other.status && pose == other.pose); }
92 };
93 
94 class Rig
95 {
96  public:
101  explicit Rig(unsigned int nbSubPoses = 0) { _subPoses.resize(nbSubPoses); }
102 
108  bool operator==(const Rig& other) const { return _subPoses == other._subPoses; }
109 
114  bool isInitialized() const
115  {
116  for (const RigSubPose& subPose : _subPoses)
117  {
118  if (subPose.status != ERigSubPoseStatus::UNINITIALIZED)
119  return true;
120  }
121  return false;
122  }
123 
124  bool isFullyCalibrated() const
125  {
126  for (const RigSubPose& subPose : _subPoses)
127  {
128  if (subPose.status == ERigSubPoseStatus::UNINITIALIZED)
129  return false;
130  }
131  return true;
132  }
133 
138  std::size_t getNbSubPoses() const { return _subPoses.size(); }
139 
144  const std::vector<RigSubPose>& getSubPoses() const { return _subPoses; }
145 
150  std::vector<RigSubPose>& getSubPoses() { return _subPoses; }
156  const RigSubPose& getSubPose(IndexT index) const { return _subPoses.at(index); }
157 
163  RigSubPose& getSubPose(IndexT index) { return _subPoses.at(index); }
164 
170  void setSubPose(IndexT index, const RigSubPose& rigSubPose)
171  {
172  assert(_subPoses.size() > index);
173  _subPoses[index] = rigSubPose;
174  }
175 
179  void reset()
180  {
181  for (RigSubPose& subPose : _subPoses)
182  {
183  subPose.status = ERigSubPoseStatus::UNINITIALIZED;
184  subPose.pose = geometry::Pose3();
185  }
186  }
187 
188  private:
190  std::vector<RigSubPose> _subPoses;
191 };
192 
193 } // namespace sfmData
194 } // namespace aliceVision
aliceVision::sfmData::RigSubPose::status
ERigSubPoseStatus status
status of the sub-pose
Definition: Rig.hpp:72
aliceVision::sfmData::Rig::Rig
Rig(unsigned int nbSubPoses=0)
Rig constructor.
Definition: Rig.hpp:101
aliceVision::sfmData::RigSubPose
Definition: Rig.hpp:69
aliceVision::sfmData::Rig::getSubPose
RigSubPose & getSubPose(IndexT index)
Get the sub-pose for the given sub-pose index.
Definition: Rig.hpp:163
aliceVision::sfmData::Rig::getSubPose
const RigSubPose & getSubPose(IndexT index) const
Get the sub-pose for the given sub-pose index.
Definition: Rig.hpp:156
aliceVision::sfmData::RigSubPose::operator==
bool operator==(const RigSubPose &other) const
operator ==
Definition: Rig.hpp:91
aliceVision
Definition: checkerDetector.cpp:32
aliceVision::sfmData::Rig::operator==
bool operator==(const Rig &other) const
operator ==
Definition: Rig.hpp:108
aliceVision::sfmData::Rig::getSubPoses
const std::vector< RigSubPose > & getSubPoses() const
Get the sub-poses const vector.
Definition: Rig.hpp:144
aliceVision::sfmData::Rig::getSubPoses
std::vector< RigSubPose > & getSubPoses()
Get the sub-poses const vector.
Definition: Rig.hpp:150
aliceVision::sfmData::Rig::isInitialized
bool isInitialized() const
Check if the rig has at least one sub-pose initialized.
Definition: Rig.hpp:114
aliceVision::sfmData::Rig
Definition: Rig.hpp:94
aliceVision::sfmData::RigSubPose::RigSubPose
RigSubPose(const geometry::Pose3 &pose=geometry::Pose3(), ERigSubPoseStatus status=ERigSubPoseStatus::UNINITIALIZED)
RigSubPose constructor.
Definition: Rig.hpp:81
aliceVision::sfmData::Rig::reset
void reset()
Reset all sub-poses parameters.
Definition: Rig.hpp:179
aliceVision::sfmData::RigSubPose::pose
geometry::Pose3 pose
relative pose of the sub-pose
Definition: Rig.hpp:74
aliceVision::sfmData::Rig::getNbSubPoses
std::size_t getNbSubPoses() const
Get the number of sub-poses in the rig.
Definition: Rig.hpp:138
aliceVision::sfmData::Rig::setSubPose
void setSubPose(IndexT index, const RigSubPose &rigSubPose)
Set the given sub-pose for the given sub-pose index.
Definition: Rig.hpp:170
aliceVision::geometry::Pose3
Definition: Pose3.hpp:18