opensfm/src/map/map.h (158 lines of code) (raw):

#pragma once #include <geo/geo.h> #include <geometry/camera.h> #include <geometry/pose.h> #include <geometry/similarity.h> #include <map/dataviews.h> #include <map/defines.h> #include <map/landmark.h> #include <map/rig.h> #include <map/shot.h> #include <map/tracks_manager.h> #include <Eigen/Core> #include <map> #include <memory> #include <set> #include <unordered_map> namespace map { class Map { public: EIGEN_MAKE_ALIGNED_OPERATOR_NEW // Camera Methods geometry::Camera& GetCamera(const CameraId& cam_id); const geometry::Camera& GetCamera(const CameraId& cam_id) const; geometry::Camera& CreateCamera(const geometry::Camera& cam); CameraView GetCameraView() { return CameraView(*this); } bool HasCamera(const CameraId& cam_id) const { return cameras_.count(cam_id) > 0; } const std::unordered_map<CameraId, geometry::Camera>& GetCameras() const { return cameras_; } std::unordered_map<CameraId, geometry::Camera>& GetCameras() { return cameras_; } // Shot Methods // Creation Shot& CreateShot(const ShotId& shot_id, const CameraId& camera_id, const RigCameraId& rig_camera_id, const RigInstanceId& instance_id, const geometry::Pose& pose); Shot& CreateShot(const ShotId& shot_id, const CameraId& camera_id, const RigCameraId& rig_camera_id, const RigInstanceId& instance_id); // Getters const Shot& GetShot(const ShotId& shot_id) const; Shot& GetShot(const ShotId& shot_id); bool HasShot(const ShotId& shot_id) const { return shots_.find(shot_id) != shots_.end(); } const std::unordered_map<ShotId, Shot>& GetShots() const { return shots_; } std::unordered_map<ShotId, Shot>& GetShots() { return shots_; } // Update Shot& UpdateShot(const Shot& other_shot); void RemoveShot(const ShotId& shot_id); ShotView GetShotView() { return ShotView(*this); } // PanoShots // Creation Shot& CreatePanoShot(const ShotId& shot_id, const CameraId& camera_id, const RigCameraId& rig_camera_id, const RigInstanceId& instance_id, const geometry::Pose& pose); // Getters Shot& GetPanoShot(const ShotId& shot_id); const Shot& GetPanoShot(const ShotId& shot_id) const; bool HasPanoShot(const ShotId& shot_id) const { return pano_shots_.find(shot_id) != pano_shots_.end(); } const std::unordered_map<ShotId, Shot>& GetPanoShots() const { return pano_shots_; } std::unordered_map<ShotId, Shot>& GetPanoShots() { return pano_shots_; } // Update void RemovePanoShot(const ShotId& shot_id); Shot& UpdatePanoShot(const Shot& other_shot); PanoShotView GetPanoShotView() { return PanoShotView(*this); } // Rigs // Creation RigCamera& CreateRigCamera(const map::RigCamera& rig_camera); RigInstance& CreateRigInstance(const map::RigInstanceId& instance_id); // Update void RemoveRigInstance(const map::RigInstanceId& instance_id); RigInstance& UpdateRigInstance(const RigInstance& other_rig_instance); // Getters size_t NumberOfRigCameras() const; RigCamera& GetRigCamera(const RigCameraId& rig_camera_id); const std::unordered_map<RigCameraId, RigCamera>& GetRigCameras() const { return rig_cameras_; } std::unordered_map<RigCameraId, RigCamera>& GetRigCameras() { return rig_cameras_; } bool HasRigCamera(const RigCameraId& rig_camera_id) const; size_t NumberOfRigInstances() const; RigInstance& GetRigInstance(const RigInstanceId& instance_id); const RigInstance& GetRigInstance(const RigInstanceId& instance_id) const; const std::unordered_map<RigInstanceId, RigInstance>& GetRigInstances() const { return rig_instances_; } std::unordered_map<RigInstanceId, RigInstance>& GetRigInstances() { return rig_instances_; } bool HasRigInstance(const RigInstanceId& instance_id) const; // Landmark // Creation Landmark& CreateLandmark(const LandmarkId& lm_id, const Vec3d& global_pos); // Getters const Landmark& GetLandmark(const LandmarkId& lm_id) const; Landmark& GetLandmark(const LandmarkId& lm_id); const std::unordered_map<LandmarkId, Landmark>& GetLandmarks() const { return landmarks_; } std::unordered_map<LandmarkId, Landmark>& GetLandmarks() { return landmarks_; } bool HasLandmark(const LandmarkId& lm_id) const { return landmarks_.count(lm_id) > 0; } LandmarkView GetLandmarkView() { return LandmarkView(*this); } // Update void RemoveLandmark(const Landmark* const lm); void RemoveLandmark(const LandmarkId& lm_id); // Observation void AddObservation(Shot* const shot, Landmark* const lm, const Observation& obs); void AddObservation(const ShotId& shot_id, const LandmarkId& lm_id, const Observation& obs); void RemoveObservation(const ShotId& shot_id, const LandmarkId& lm_id); void ClearObservationsAndLandmarks(); void CleanLandmarksBelowMinObservations(const size_t min_observations); // Map information and access methods size_t NumberOfShots() const { return shots_.size(); } size_t NumberOfPanoShots() const { return pano_shots_.size(); } size_t NumberOfLandmarks() const { return landmarks_.size(); } size_t NumberOfCameras() const { return cameras_.size(); } size_t NumberOfBiases() const { return bias_.size(); } // Bias BiasView GetBiasView() { return BiasView(*this); } geometry::Similarity& GetBias(const CameraId& camera_id); void SetBias(const CameraId& camera_id, const geometry::Similarity& transform); bool HasBias(const CameraId& cam_id) const { return bias_.find(cam_id) != bias_.end(); } const std::unordered_map<CameraId, geometry::Similarity>& GetBiases() const { return bias_; } std::unordered_map<CameraId, geometry::Similarity>& GetBiases() { return bias_; } // TopocentricConverter const geo::TopocentricConverter& GetTopocentricConverter() const { return topo_conv_; } void SetTopocentricConverter(const double lat, const double longitude, const double alt) { topo_conv_.lat_ = lat; topo_conv_.long_ = longitude; topo_conv_.alt_ = alt; } TracksManager ToTracksManager() const; // Tracks manager x Reconstruction intersection functions enum ErrorType { Pixel = 0x0, Normalized = 0x1, Angular = 0x2 }; std::unordered_map<ShotId, std::unordered_map<LandmarkId, Vec2d> > ComputeReprojectionErrors(const TracksManager& tracks_manager, const ErrorType& error_type) const; std::unordered_map<ShotId, std::unordered_map<LandmarkId, Observation> > GetValidObservations(const TracksManager& tracks_manager) const; private: void UpdateShotWithRig(const Shot& other_shot); std::unordered_map<CameraId, geometry::Camera> cameras_; std::unordered_map<CameraId, geometry::Similarity> bias_; std::unordered_map<ShotId, Shot> shots_; std::unordered_map<ShotId, Shot> pano_shots_; std::unordered_map<LandmarkId, Landmark> landmarks_; std::unordered_map<RigInstanceId, RigInstance> rig_instances_; std::unordered_map<RigCameraId, RigCamera> rig_cameras_; geo::TopocentricConverter topo_conv_; }; } // namespace map