Berkeley SfM
Public Types | Public Member Functions | Static Public Member Functions | Private Member Functions | Static Private Member Functions | Private Attributes | Static Private Attributes | List of all members
bsfm::Landmark Class Reference

#include <landmark.h>

Public Types

typedef std::shared_ptr< LandmarkPtr
 
typedef std::shared_ptr< const LandmarkConstPtr
 

Public Member Functions

 ~Landmark ()
 
LandmarkIndex Index () const
 
void SetPosition (const Point3D &position)
 
void SetDescriptor (const ::bsfm::Descriptor &descriptor)
 
void ClearObservations ()
 
const Point3DPosition () const
 
const ::bsfm::DescriptorDescriptor () const
 
const std::vector< Observation::Ptr > & Observations () const
 
double * PositionData ()
 
bool IncorporateObservation (const Observation::Ptr &observation, bool retriangulate=true)
 
std::shared_ptr< ViewSourceView () const
 
bool SeenByAtLeastTwoViews (const std::vector< ViewIndex > &view_indices)
 

Static Public Member Functions

static Landmark::Ptr Create ()
 
static Landmark::Ptr GetLandmark (LandmarkIndex landmark_index)
 
static LandmarkIndex NumExistingLandmarks ()
 
static bool IsValidLandmark (LandmarkIndex landmark_index)
 
static void ResetLandmarks ()
 

Private Member Functions

 Landmark ()
 

Static Private Member Functions

static LandmarkIndex NextLandmarkIndex ()
 

Private Attributes

Point3D position_
 
LandmarkIndex landmark_index_
 
std::vector< Observation::Ptrobservations_
 
::bsfm::Descriptor descriptor_
 

Static Private Attributes

static std::unordered_map< LandmarkIndex, Landmark::Ptrlandmark_registry_
 
static LandmarkIndex current_landmark_index_ = 0
 

Detailed Description

Definition at line 64 of file landmark.h.

Member Typedef Documentation

typedef std::shared_ptr<const Landmark> bsfm::Landmark::ConstPtr

Definition at line 67 of file landmark.h.

typedef std::shared_ptr<Landmark> bsfm::Landmark::Ptr

Definition at line 66 of file landmark.h.

Constructor & Destructor Documentation

bsfm::Landmark::~Landmark ( )
inline

Definition at line 74 of file landmark.h.

74 {}
bsfm::Landmark::Landmark ( )
private

Definition at line 222 of file landmark.cpp.

223  : position_(Point3D(0.0, 0.0, 0.0)), landmark_index_(NextLandmarkIndex()) {}
static LandmarkIndex NextLandmarkIndex()
Definition: landmark.cpp:227
LandmarkIndex landmark_index_
Definition: landmark.h:142
Point3D position_
Definition: landmark.h:139

Member Function Documentation

void bsfm::Landmark::ClearObservations ( )

Definition at line 104 of file landmark.cpp.

104  {
105  observations_.clear();
106 }
std::vector< Observation::Ptr > observations_
Definition: landmark.h:150
Landmark::Ptr bsfm::Landmark::Create ( )
static

Definition at line 50 of file landmark.cpp.

50  {
51  // Create a new Landmark, implicitly assigning a unique index.
52  Landmark::Ptr landmark(new Landmark());
53  landmark_registry_.insert(std::make_pair(landmark->Index(), landmark));
54  return landmark;
55 }
static std::unordered_map< LandmarkIndex, Landmark::Ptr > landmark_registry_
Definition: landmark.h:146
std::shared_ptr< Landmark > Ptr
Definition: landmark.h:66
const ::bsfm::Descriptor & bsfm::Landmark::Descriptor ( ) const

Definition at line 114 of file landmark.cpp.

114  {
115  return descriptor_;
116 }
::bsfm::Descriptor descriptor_
Definition: landmark.h:154
Landmark::Ptr bsfm::Landmark::GetLandmark ( LandmarkIndex  landmark_index)
static

Definition at line 59 of file landmark.cpp.

59  {
60  auto registry_element = landmark_registry_.find(landmark_index);
61  if (registry_element == landmark_registry_.end()) {
62  LOG(WARNING)
63  << "Landmark does not exist in registry. Returning a null pointer.";
64  return Landmark::Ptr();
65  }
66 
67  return registry_element->second;
68 }
static std::unordered_map< LandmarkIndex, Landmark::Ptr > landmark_registry_
Definition: landmark.h:146
std::shared_ptr< Landmark > Ptr
Definition: landmark.h:66
bool bsfm::Landmark::IncorporateObservation ( const Observation::Ptr observation,
bool  retriangulate = true 
)

Definition at line 132 of file landmark.cpp.

133  {
134  CHECK_NOTNULL(observation.get());
135 
136  // If this is our first observation, store it, tell the observation that it
137  // has been matched with us, and return.
138  if (observations_.empty()) {
139  observation->SetIncorporatedLandmark(this->Index());
140  observations_.push_back(observation);
141  descriptor_ = observation->Descriptor();
142  return true;
143  }
144 
145  // Does our own descriptor match with the observation's descriptor?
146  std::vector<::bsfm::Descriptor> descriptors;
147  descriptors.push_back(descriptor_);
148  descriptors.push_back(observation->Descriptor());
149  DistanceMetric& distance = DistanceMetric::Instance();
150  distance.MaybeNormalizeDescriptors(descriptors);
151 
152  if (distance(descriptors[0], descriptors[1]) > distance.Max()) {
153  VLOG(1) << "Observation was not matched to landmark " << this->Index();
154  return false;
155  }
156 
157  // Triangulate the landmark's putative position if we were to incorporate the
158  // new observation.
159  if (retriangulate) {
160  std::vector<Camera> cameras;
161  std::vector<Feature> features;
162  for (const auto& obs : observations_) {
163  cameras.push_back(obs->GetView()->Camera());
164  features.push_back(obs->Feature());
165  }
166  cameras.push_back(observation->GetView()->Camera());
167  features.push_back(observation->Feature());
168 
169  // If triangulation fails, we don't have a match and won't update position.
170  Point3D new_position;
171  if (!Triangulate(features, cameras, new_position)) {
172  return false;
173  }
174  position_ = new_position;
175  }
176 
177  // Successfully triangulated the landmark. Update its position and store this
178  // observation. Also tell the observation that it has been matched with us.
179  observation->SetIncorporatedLandmark(this->Index());
180  observations_.push_back(observation);
181 
182  return true;
183 }
::bsfm::Descriptor descriptor_
Definition: landmark.h:154
Point3D position_
Definition: landmark.h:139
static DistanceMetric & Instance()
std::vector< Observation::Ptr > observations_
Definition: landmark.h:150
LandmarkIndex Index() const
Definition: landmark.cpp:89
bool Triangulate(const FeatureList &features, const std::vector< Camera > &cameras, Point3D &point)
LandmarkIndex bsfm::Landmark::Index ( ) const

Definition at line 89 of file landmark.cpp.

89  {
90  return landmark_index_;
91 }
LandmarkIndex landmark_index_
Definition: landmark.h:142
bool bsfm::Landmark::IsValidLandmark ( LandmarkIndex  landmark_index)
static

Definition at line 77 of file landmark.cpp.

77  {
78  return landmark_index <= current_landmark_index_;
79 }
static LandmarkIndex current_landmark_index_
Definition: landmark.h:157
LandmarkIndex bsfm::Landmark::NextLandmarkIndex ( )
staticprivate

Definition at line 227 of file landmark.cpp.

227  {
228  return current_landmark_index_++;
229 }
static LandmarkIndex current_landmark_index_
Definition: landmark.h:157
LandmarkIndex bsfm::Landmark::NumExistingLandmarks ( )
static

Definition at line 71 of file landmark.cpp.

71  {
72  return landmark_registry_.size();
73 }
static std::unordered_map< LandmarkIndex, Landmark::Ptr > landmark_registry_
Definition: landmark.h:146
const std::vector< Observation::Ptr > & bsfm::Landmark::Observations ( ) const

Definition at line 119 of file landmark.cpp.

119  {
120  return observations_;
121 }
std::vector< Observation::Ptr > observations_
Definition: landmark.h:150
const Point3D & bsfm::Landmark::Position ( ) const

Definition at line 109 of file landmark.cpp.

109  {
110  return position_;
111 }
Point3D position_
Definition: landmark.h:139
double * bsfm::Landmark::PositionData ( )

Definition at line 126 of file landmark.cpp.

126  {
127  return position_.Get().data();
128 }
Point3D position_
Definition: landmark.h:139
Vector3d & Get()
Definition: point_3d.cpp:98
void bsfm::Landmark::ResetLandmarks ( )
static

Definition at line 83 of file landmark.cpp.

83  {
85  landmark_registry_.clear();
86 }
static LandmarkIndex current_landmark_index_
Definition: landmark.h:157
static std::unordered_map< LandmarkIndex, Landmark::Ptr > landmark_registry_
Definition: landmark.h:146
bool bsfm::Landmark::SeenByAtLeastTwoViews ( const std::vector< ViewIndex > &  view_indices)

Definition at line 198 of file landmark.cpp.

198  {
199  unsigned int count = 0;
200  for (const auto& view_index : view_indices) {
201  // If they gave us a bad input, ignore it and continue.
202  if (!View::IsValidView(view_index))
203  continue;
204 
205  // Make sure this view knows all landmarks its observations have seen.
206  View::Ptr view = View::GetView(view_index);
207  view->UpdateObservedLandmarks();
208  if (view->HasObservedLandmark(this->Index())) {
209  count++;
210  }
211 
212  if (count == 2) {
213  return true;
214  }
215  }
216 
217  return false;
218 }
static View::Ptr GetView(ViewIndex view_index)
Definition: view.cpp:60
std::shared_ptr< View > Ptr
Definition: view.h:66
static bool IsValidView(ViewIndex view_index)
Definition: view.cpp:77
void bsfm::Landmark::SetDescriptor ( const ::bsfm::Descriptor descriptor)

Definition at line 99 of file landmark.cpp.

99  {
100  descriptor_ = descriptor;
101 }
::bsfm::Descriptor descriptor_
Definition: landmark.h:154
void bsfm::Landmark::SetPosition ( const Point3D position)

Definition at line 94 of file landmark.cpp.

94  {
95  position_ = position;
96 }
Point3D position_
Definition: landmark.h:139
View::Ptr bsfm::Landmark::SourceView ( ) const

Definition at line 186 of file landmark.cpp.

186  {
187  if (observations_.empty()) {
188  LOG(WARNING) << "Landmark has not been associated with any observations, "
189  "so source view is undefined. Returning null pointer.";
190  return View::Ptr();
191  }
192 
193  return observations_.front()->GetView();
194 }
std::vector< Observation::Ptr > observations_
Definition: landmark.h:150
std::shared_ptr< View > Ptr
Definition: view.h:66

Member Data Documentation

LandmarkIndex bsfm::Landmark::current_landmark_index_ = 0
staticprivate

Definition at line 157 of file landmark.h.

::bsfm::Descriptor bsfm::Landmark::descriptor_
private

Definition at line 154 of file landmark.h.

LandmarkIndex bsfm::Landmark::landmark_index_
private

Definition at line 142 of file landmark.h.

std::unordered_map< LandmarkIndex, Landmark::Ptr > bsfm::Landmark::landmark_registry_
staticprivate

Definition at line 146 of file landmark.h.

std::vector<Observation::Ptr> bsfm::Landmark::observations_
private

Definition at line 150 of file landmark.h.

Point3D bsfm::Landmark::position_
private

Definition at line 139 of file landmark.h.


The documentation for this class was generated from the following files: