41 const Eigen::Vector2d& point1,
42 const Eigen::Vector2d& point2) {
45 A.row(0) = point1(0) * proj_matrix1.row(2) - proj_matrix1.row(0);
46 A.row(1) = point1(1) * proj_matrix1.row(2) - proj_matrix1.row(1);
47 A.row(2) = point2(0) * proj_matrix2.row(2) - proj_matrix2.row(0);
48 A.row(3) = point2(1) * proj_matrix2.row(2) - proj_matrix2.row(1);
50 Eigen::JacobiSVD<Eigen::Matrix4d> svd(A, Eigen::ComputeFullV);
52 return svd.matrixV().col(3).hnormalized();
58 const std::vector<Eigen::Vector2d>& points1,
59 const std::vector<Eigen::Vector2d>& points2) {
60 CHECK_EQ(points1.size(), points2.size());
62 std::vector<Eigen::Vector3d> points3D(points1.size());
64 for (
size_t i = 0; i < points3D.size(); ++i) {
73 const std::vector<Eigen::Matrix3x4d>& proj_matrices,
74 const std::vector<Eigen::Vector2d>&
points) {
75 CHECK_EQ(proj_matrices.size(),
points.size());
77 Eigen::Matrix4d A = Eigen::Matrix4d::Zero();
79 for (
size_t i = 0; i <
points.size(); i++) {
80 const Eigen::Vector3d point =
points[i].homogeneous().normalized();
82 proj_matrices[i] - point * point.transpose() * proj_matrices[i];
83 A += term.transpose() * term;
86 Eigen::SelfAdjointEigenSolver<Eigen::Matrix4d> eigen_solver(A);
88 return eigen_solver.eigenvectors().col(0).hnormalized();
93 const Eigen::Vector2d& point1,
94 const Eigen::Vector2d& point2) {
95 const Eigen::Matrix3d E =
98 Eigen::Vector2d optimal_point1;
99 Eigen::Vector2d optimal_point2;
110 const std::vector<Eigen::Vector2d>& points1,
111 const std::vector<Eigen::Vector2d>& points2) {
112 std::vector<Eigen::Vector3d> points3D(points1.size());
114 for (
size_t i = 0; i < points3D.size(); ++i) {
123 const Eigen::Vector3d& proj_center2,
124 const Eigen::Vector3d& point3D) {
125 const double baseline_length_squared =
126 (proj_center1 - proj_center2).squaredNorm();
128 const double ray_length_squared1 = (point3D - proj_center1).squaredNorm();
129 const double ray_length_squared2 = (point3D - proj_center2).squaredNorm();
132 const double denominator =
133 2.0 * std::sqrt(ray_length_squared1 * ray_length_squared2);
134 if (denominator == 0.0) {
137 const double nominator =
138 ray_length_squared1 + ray_length_squared2 - baseline_length_squared;
139 const double angle = std::abs(std::acos(nominator / denominator));
144 return std::min(angle,
M_PI - angle);
148 const Eigen::Vector3d& proj_center1,
const Eigen::Vector3d& proj_center2,
149 const std::vector<Eigen::Vector3d>& points3D) {
151 const double baseline_length_squared =
152 (proj_center1 - proj_center2).squaredNorm();
154 std::vector<double> angles(points3D.size());
156 for (
size_t i = 0; i < points3D.size(); ++i) {
158 const double ray_length_squared1 =
159 (points3D[i] - proj_center1).squaredNorm();
160 const double ray_length_squared2 =
161 (points3D[i] - proj_center2).squaredNorm();
164 const double denominator =
165 2.0 * std::sqrt(ray_length_squared1 * ray_length_squared2);
166 if (denominator == 0.0) {
170 const double nominator =
171 ray_length_squared1 + ray_length_squared2 - baseline_length_squared;
172 const double angle = std::abs(std::acos(nominator / denominator));
177 angles[i] = std::min(angle,
M_PI - angle);
Matrix< double, 3, 4 > Matrix3x4d
Eigen::Vector3d TriangulateOptimalPoint(const Eigen::Matrix3x4d &proj_matrix1, const Eigen::Matrix3x4d &proj_matrix2, const Eigen::Vector2d &point1, const Eigen::Vector2d &point2)
std::vector< Eigen::Vector3d > TriangulateOptimalPoints(const Eigen::Matrix3x4d &proj_matrix1, const Eigen::Matrix3x4d &proj_matrix2, const std::vector< Eigen::Vector2d > &points1, const std::vector< Eigen::Vector2d > &points2)
Eigen::Matrix3d EssentialMatrixFromAbsolutePoses(const Eigen::Matrix3x4d &proj_matrix1, const Eigen::Matrix3x4d &proj_matrix2)
void FindOptimalImageObservations(const Eigen::Matrix3d &E, const Eigen::Vector2d &point1, const Eigen::Vector2d &point2, Eigen::Vector2d *optimal_point1, Eigen::Vector2d *optimal_point2)
std::vector< double > CalculateTriangulationAngles(const Eigen::Vector3d &proj_center1, const Eigen::Vector3d &proj_center2, const std::vector< Eigen::Vector3d > &points3D)
Eigen::Vector3d TriangulateMultiViewPoint(const std::vector< Eigen::Matrix3x4d > &proj_matrices, const std::vector< Eigen::Vector2d > &points)
Eigen::Vector3d TriangulatePoint(const Eigen::Matrix3x4d &proj_matrix1, const Eigen::Matrix3x4d &proj_matrix2, const Eigen::Vector2d &point1, const Eigen::Vector2d &point2)
std::vector< Eigen::Vector3d > TriangulatePoints(const Eigen::Matrix3x4d &proj_matrix1, const Eigen::Matrix3x4d &proj_matrix2, const std::vector< Eigen::Vector2d > &points1, const std::vector< Eigen::Vector2d > &points2)
double CalculateTriangulationAngle(const Eigen::Vector3d &proj_center1, const Eigen::Vector3d &proj_center2, const Eigen::Vector3d &point3D)