15 #include <unordered_map>
16 #include <unordered_set>
35 class CorrespondenceGraph;
80 inline const std::unordered_map<camera_t, class Camera>&
Cameras()
const;
81 inline const std::unordered_map<image_t, class Image>&
Images()
const;
82 inline const std::vector<image_t>&
RegImageIds()
const;
83 inline const std::unordered_map<point3D_t, class Point3D>&
Points3D()
const;
84 inline const std::unordered_map<image_pair_t, ImagePairStat>&
ImagePairs()
88 std::unordered_set<point3D_t>
Point3DIds()
const;
120 const Eigen::Vector3d& xyz,
164 void Normalize(
const double extent = 10.0,
165 const double p0 = 0.1,
166 const double p1 = 0.9,
167 const bool use_images =
true);
171 const double p1 = 0.9)
const;
175 const double p0 = 0.0,
const double p1 = 1.0)
const;
185 const std::pair<Eigen::Vector3d, Eigen::Vector3d>& bbox)
const;
194 const double max_reproj_error);
199 template <
bool kEstimateScale = true>
200 bool Align(
const std::vector<std::string>& image_names,
201 const std::vector<Eigen::Vector3d>& locations,
202 const int min_common_images,
206 template <
bool kEstimateScale = true>
207 bool AlignRobust(
const std::vector<std::string>& image_names,
208 const std::vector<Eigen::Vector3d>& locations,
209 const int min_common_images,
233 const double min_tri_angle,
234 const std::unordered_set<point3D_t>& point3D_ids);
236 const double min_tri_angle,
237 const std::unordered_set<image_t>& image_ids);
239 const double min_tri_angle);
249 std::vector<image_t>
FilterImages(
const double min_focal_length_ratio,
250 const double max_focal_length_ratio,
251 const double max_extra_param);
261 void Write(
const std::string&
path)
const;
277 void ImportPLY(
const std::vector<PlyPoint>& ply_points);
286 bool ExportNVM(
const std::string&
path,
bool skip_distortion =
false)
const;
303 bool ExportCam(
const std::string&
path,
bool skip_distortion =
false)
const;
336 bool skip_distortion =
false)
const;
345 const std::string& list_path,
346 bool skip_distortion =
false)
const;
352 void ExportVRML(
const std::string& images_path,
353 const std::string& points3D_path,
354 const double image_scale,
355 const Eigen::Vector3d& image_rgb)
const;
384 size_t FilterPoints3DWithSmallTriangulationAngle(
385 const double min_tri_angle,
386 const std::unordered_set<point3D_t>& point3D_ids);
387 size_t FilterPoints3DWithLargeReprojectionError(
388 const double max_reproj_error,
389 const std::unordered_set<point3D_t>& point3D_ids);
391 std::tuple<Eigen::Vector3d, Eigen::Vector3d, Eigen::Vector3d>
392 ComputeBoundsAndCentroid(
const double p0,
394 const bool use_images)
const;
396 void ReadCamerasText(
const std::string&
path);
397 void ReadImagesText(
const std::string&
path);
398 void ReadPoints3DText(
const std::string&
path);
399 void ReadCamerasBinary(
const std::string&
path);
400 void ReadImagesBinary(
const std::string&
path);
401 void ReadPoints3DBinary(
const std::string&
path);
403 void WriteCamerasText(
const std::string&
path)
const;
404 void WriteImagesText(
const std::string&
path)
const;
405 void WritePoints3DText(
const std::string&
path)
const;
406 void WriteCamerasBinary(
const std::string&
path)
const;
407 void WriteImagesBinary(
const std::string&
path)
const;
408 void WritePoints3DBinary(
const std::string&
path)
const;
410 void SetObservationAsTriangulated(
const image_t image_id,
412 const bool is_continued_point3D);
413 void ResetTriObservations(
const image_t image_id,
415 const bool is_deleted_point3D);
419 std::unordered_map<camera_t, class Camera> cameras_;
420 std::unordered_map<image_t, class Image> images_;
421 std::unordered_map<point3D_t, class Point3D> points3D_;
423 std::unordered_map<image_pair_t, ImagePairStat> image_pair_stats_;
426 std::vector<image_t> reg_image_ids_;
445 return image_pair_stats_.size();
451 return cameras_.at(camera_id);
455 return images_.at(image_id);
459 return points3D_.at(point3D_id);
464 return image_pair_stats_.at(pair_id);
470 return image_pair_stats_.at(pair_id);
474 return cameras_.at(camera_id);
478 return images_.at(image_id);
482 return points3D_.at(point3D_id);
487 return image_pair_stats_.at(pair_id);
493 return image_pair_stats_.at(pair_id);
505 return reg_image_ids_;
512 const std::unordered_map<image_pair_t, Reconstruction::ImagePairStat>&
514 return image_pair_stats_;
518 return cameras_.find(camera_id) != cameras_.end();
522 return images_.find(image_id) != images_.end();
526 return points3D_.find(point3D_id) != points3D_.end();
530 return image_pair_stats_.find(pair_id) != image_pair_stats_.end();
538 return correspondence_graph_;
542 return correspondence_graph_ !=
nullptr;
545 template <
bool kEstimateScale>
547 const std::vector<Eigen::Vector3d>& locations,
548 const int min_common_images,
550 CHECK_GE(min_common_images, 3);
551 CHECK_EQ(image_names.size(), locations.size());
555 std::unordered_set<image_t> common_image_ids;
556 std::vector<Eigen::Vector3d> src;
557 std::vector<Eigen::Vector3d> dst;
558 for (
size_t i = 0; i < image_names.size(); ++i) {
560 if (
image ==
nullptr) {
569 if (common_image_ids.count(
image->ImageId()) > 0) {
573 common_image_ids.insert(
image->ImageId());
574 src.push_back(
image->ProjectionCenter());
575 dst.push_back(locations[i]);
579 if (common_image_ids.size() <
static_cast<size_t>(min_common_images)) {
584 if (!transform.
Estimate<kEstimateScale>(src, dst)) {
590 if (tform !=
nullptr) {
597 template <
bool kEstimateScale>
599 const std::vector<Eigen::Vector3d>& locations,
600 const int min_common_images,
603 CHECK_GE(min_common_images, 3);
604 CHECK_EQ(image_names.size(), locations.size());
608 std::unordered_set<image_t> common_image_ids;
609 std::vector<Eigen::Vector3d> src;
610 std::vector<Eigen::Vector3d> dst;
611 for (
size_t i = 0; i < image_names.size(); ++i) {
613 if (
image ==
nullptr) {
622 if (common_image_ids.count(
image->ImageId()) > 0) {
626 common_image_ids.insert(
image->ImageId());
627 src.push_back(
image->ProjectionCenter());
628 dst.push_back(locations[i]);
632 if (common_image_ids.size() <
static_cast<size_t>(min_common_images)) {
638 ransac(ransac_options);
640 const auto report = ransac.
Estimate(src, dst);
642 if (report.support.num_inliers <
static_cast<size_t>(min_common_images)) {
649 if (tform !=
nullptr) {
std::shared_ptr< core::Tensor > image
static image_pair_t ImagePairToPairId(const image_t image_id1, const image_t image_id2)
bool IsRegistered() const
Report Estimate(const std::vector< typename Estimator::X_t > &X, const std::vector< typename Estimator::Y_t > &Y)
void ReadBinary(const std::string &path)
bool Align(const std::vector< std::string > &image_names, const std::vector< Eigen::Vector3d > &locations, const int min_common_images, SimilarityTransform3 *tform=nullptr)
void ExtractColorsForAllImages(const std::string &path)
bool ExportCam(const std::string &path, bool skip_distortion=false) const
size_t FilterAllPoints3D(const double max_reproj_error, const double min_tri_angle)
Reconstruction Crop(const std::pair< Eigen::Vector3d, Eigen::Vector3d > &bbox) const
double ComputeMeanTrackLength() const
point3D_t MergePoints3D(const point3D_t point3D_id1, const point3D_t point3D_id2)
size_t NumRegImages() const
Reconstruction & operator=(const Reconstruction &other)
void Transform(const SimilarityTransform3 &tform)
std::pair< Eigen::Vector3d, Eigen::Vector3d > ComputeBoundingBox(const double p0=0.0, const double p1=1.0) const
size_t FilterObservationsWithNegativeDepth()
void Write(const std::string &path) const
void DeleteAllPoints2DAndPoints3D()
std::vector< image_t > FindCommonRegImageIds(const Reconstruction &reconstruction) const
void Normalize(const double extent=10.0, const double p0=0.1, const double p1=0.9, const bool use_images=true)
bool IsImageRegistered(const image_t image_id) const
bool ExportNVM(const std::string &path, bool skip_distortion=false) const
void AddImage(const class Image &image)
bool ExtractColorsForImage(const image_t image_id, const std::string &path)
const std::unordered_map< image_t, class Image > & Images() const
void AddCamera(const class Camera &camera)
std::vector< image_t > FilterImages(const double min_focal_length_ratio, const double max_focal_length_ratio, const double max_extra_param)
void DeleteObservation(const image_t image_id, const point2D_t point2D_idx)
size_t ComputeNumObservations() const
Eigen::Vector3d ComputeCentroid(const double p0=0.1, const double p1=0.9) const
const class Image & Image(const image_t image_id) const
bool ExportRecon3D(const std::string &path, bool skip_distortion=false) const
void ExportPLY(const std::string &path) const
std::unordered_set< point3D_t > Point3DIds() const
size_t NumPoints3D() const
const class Camera & Camera(const camera_t camera_id) const
void WriteBinary(const std::string &path) const
std::vector< PlyPoint > ConvertToPLY() const
bool Merge(const Reconstruction &reconstruction, const double max_reproj_error)
void ExportVRML(const std::string &images_path, const std::string &points3D_path, const double image_scale, const Eigen::Vector3d &image_rgb) const
bool ExportBundler(const std::string &path, const std::string &list_path, bool skip_distortion=false) const
void CreateImageDirs(const std::string &path) const
bool AlignRobust(const std::vector< std::string > &image_names, const std::vector< Eigen::Vector3d > &locations, const int min_common_images, const RANSACOptions &ransac_options, SimilarityTransform3 *tform=nullptr)
const std::unordered_map< camera_t, class Camera > & Cameras() const
void Load(const DatabaseCache &database_cache)
const std::unordered_map< point3D_t, class Point3D > & Points3D() const
bool ExistsCamera(const camera_t camera_id) const
void AddObservation(const point3D_t point3D_id, const TrackElement &track_el)
const class Image * FindImageWithName(const std::string &name) const
const std::unordered_map< image_pair_t, ImagePairStat > & ImagePairs() const
void DeRegisterImage(const image_t image_id)
void ReadText(const std::string &path)
const std::vector< image_t > & RegImageIds() const
size_t FilterPoints3D(const double max_reproj_error, const double min_tri_angle, const std::unordered_set< point3D_t > &point3D_ids)
size_t NumImagePairs() const
void DeletePoint3D(const point3D_t point3D_id)
double ComputeMeanReprojectionError() const
bool ExistsImage(const image_t image_id) const
double ComputeMeanObservationsPerRegImage() const
const ImagePairStat & ImagePair(const image_pair_t pair_id) const
void RegisterImage(const image_t image_id)
void WriteText(const std::string &path) const
size_t FilterPoints3DInImages(const double max_reproj_error, const double min_tri_angle, const std::unordered_set< image_t > &image_ids)
size_t NumCameras() const
void ImportPLY(const std::string &path)
void Read(const std::string &path)
const class Point3D & Point3D(const point3D_t point3D_id) const
point3D_t AddPoint3D(const Eigen::Vector3d &xyz, const Track &track, const Eigen::Vector3ub &color=Eigen::Vector3ub::Zero())
bool ExistsImagePair(const image_pair_t pair_id) const
void SetUp(const CorrespondenceGraph *correspondence_graph)
size_t NumAddedPoints3D() const
bool ExistsPoint3D(const point3D_t point3D_id) const
const CorrespondenceGraph * GetCorrespondenceGraph() const
bool HasCorrespondenceGraph() const
void TranscribeImageIdsToDatabase(const Database &database)
Matrix< uint8_t, 3, 1 > Vector3ub
static const std::string path