ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
similarity_transform.h
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #pragma once
9 
10 #include <Eigen/Core>
11 #include <Eigen/Geometry>
12 #include <vector>
13 
15 #include "util/alignment.h"
16 #include "util/types.h"
17 
18 namespace colmap {
19 
20 struct RANSACOptions;
21 class Reconstruction;
22 
23 // 3D similarity transformation with 7 degrees of freedom.
25 public:
27 
28  explicit SimilarityTransform3(const Eigen::Matrix3x4d& matrix);
29 
30  explicit SimilarityTransform3(
31  const Eigen::Transform<double, 3, Eigen::Affine>& transform);
32 
33  SimilarityTransform3(const double scale,
34  const Eigen::Vector4d& qvec,
35  const Eigen::Vector3d& tvec);
36 
37  void Write(const std::string& path);
38 
39  template <bool kEstimateScale = true>
40  bool Estimate(const std::vector<Eigen::Vector3d>& src,
41  const std::vector<Eigen::Vector3d>& dst);
42 
44 
45  void TransformPoint(Eigen::Vector3d* xyz) const;
46  void TransformPose(Eigen::Vector4d* qvec, Eigen::Vector3d* tvec) const;
47 
48  Eigen::Matrix4d Matrix() const;
49  double Scale() const;
50  Eigen::Vector4d Rotation() const;
51  Eigen::Vector3d Translation() const;
52 
53  static SimilarityTransform3 FromFile(const std::string& path);
54 
55 private:
56  Eigen::Transform<double, 3, Eigen::Affine> transform_;
57 };
58 
59 // Robustly compute alignment between reconstructions by finding images that
60 // are registered in both reconstructions. The alignment is then estimated
61 // robustly inside RANSAC from corresponding projection centers. An alignment
62 // is verified by reprojecting common 3D point observations.
63 // The min_inlier_observations threshold determines how many observations
64 // in a common image must reproject within the given threshold.
66  const Reconstruction& src_reconstruction,
67  const Reconstruction& ref_reconstruction,
68  const double min_inlier_observations,
69  const double max_reproj_error,
70  Eigen::Matrix3x4d* alignment);
71 
73 // Implementation
75 
76 template <bool kEstimateScale>
77 bool SimilarityTransform3::Estimate(const std::vector<Eigen::Vector3d>& src,
78  const std::vector<Eigen::Vector3d>& dst) {
79  const auto results =
81  dst);
82  if (results.empty()) {
83  return false;
84  }
85 
86  CHECK_EQ(results.size(), 1);
87  transform_.matrix().topLeftCorner<3, 4>() = results[0];
88 
89  return true;
90 }
91 
92 } // namespace colmap
93 
94 // EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION_CUSTOM(colmap::SimilarityTransform3)
void Write(const std::string &path)
static SimilarityTransform3 FromFile(const std::string &path)
void TransformPose(Eigen::Vector4d *qvec, Eigen::Vector3d *tvec) const
bool Estimate(const std::vector< Eigen::Vector3d > &src, const std::vector< Eigen::Vector3d > &dst)
Eigen::Matrix4d Matrix() const
SimilarityTransform3 Inverse() const
Eigen::Vector4d Rotation() const
void TransformPoint(Eigen::Vector3d *xyz) const
Eigen::Vector3d Translation() const
static std::vector< M_t > Estimate(const std::vector< X_t > &src, const std::vector< Y_t > &dst)
Matrix< double, 3, 4 > Matrix3x4d
Definition: types.h:39
static const std::string path
Definition: PointCloud.cpp:59
bool ComputeAlignmentBetweenReconstructions(const Reconstruction &src_reconstruction, const Reconstruction &ref_reconstruction, const double min_inlier_observations, const double max_reproj_error, Eigen::Matrix3x4d *alignment)