ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
triangulation.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 <vector>
12 
13 #include "base/camera.h"
14 #include "util/alignment.h"
15 #include "util/math.h"
16 #include "util/types.h"
17 
18 namespace colmap {
19 
20 // Triangulate 3D point from corresponding image point observations.
21 //
22 // Implementation of the direct linear transform triangulation method in
23 // R. Hartley and A. Zisserman, Multiple View Geometry in Computer Vision,
24 // Cambridge Univ. Press, 2003.
25 //
26 // @param proj_matrix1 Projection matrix of the first image as 3x4 matrix.
27 // @param proj_matrix2 Projection matrix of the second image as 3x4 matrix.
28 // @param point1 Corresponding 2D point in first image.
29 // @param point2 Corresponding 2D point in second image.
30 //
31 // @return Triangulated 3D point.
32 Eigen::Vector3d TriangulatePoint(const Eigen::Matrix3x4d& proj_matrix1,
33  const Eigen::Matrix3x4d& proj_matrix2,
34  const Eigen::Vector2d& point1,
35  const Eigen::Vector2d& point2);
36 
37 // Triangulate multiple 3D points from multiple image correspondences.
38 std::vector<Eigen::Vector3d> TriangulatePoints(
39  const Eigen::Matrix3x4d& proj_matrix1,
40  const Eigen::Matrix3x4d& proj_matrix2,
41  const std::vector<Eigen::Vector2d>& points1,
42  const std::vector<Eigen::Vector2d>& points2);
43 
44 // Triangulate point from multiple views minimizing the L2 error.
45 //
46 // @param proj_matrices Projection matrices of multi-view observations.
47 // @param points Image observations of multi-view observations.
48 //
49 // @return Estimated 3D point.
50 Eigen::Vector3d TriangulateMultiViewPoint(
51  const std::vector<Eigen::Matrix3x4d>& proj_matrices,
52  const std::vector<Eigen::Vector2d>& points);
53 
54 // Triangulate optimal 3D point from corresponding image point observations by
55 // finding the optimal image observations.
56 //
57 // Note that camera poses should be very good in order for this method to yield
58 // good results. Otherwise just use `TriangulatePoint`.
59 //
60 // Implementation of the method described in
61 // P. Lindstrom, "Triangulation Made Easy," IEEE Computer Vision and Pattern
62 // Recognition 2010, pp. 1554-1561, June 2010.
63 //
64 // @param proj_matrix1 Projection matrix of the first image as 3x4 matrix.
65 // @param proj_matrix2 Projection matrix of the second image as 3x4 matrix.
66 // @param point1 Corresponding 2D point in first image.
67 // @param point2 Corresponding 2D point in second image.
68 //
69 // @return Triangulated optimal 3D point.
70 Eigen::Vector3d TriangulateOptimalPoint(const Eigen::Matrix3x4d& proj_matrix1,
71  const Eigen::Matrix3x4d& proj_matrix2,
72  const Eigen::Vector2d& point1,
73  const Eigen::Vector2d& point2);
74 
75 // Triangulate multiple optimal 3D points from multiple image correspondences.
76 std::vector<Eigen::Vector3d> TriangulateOptimalPoints(
77  const Eigen::Matrix3x4d& proj_matrix1,
78  const Eigen::Matrix3x4d& proj_matrix2,
79  const std::vector<Eigen::Vector2d>& points1,
80  const std::vector<Eigen::Vector2d>& points2);
81 
82 // Calculate angle in radians between the two rays of a triangulated point.
83 double CalculateTriangulationAngle(const Eigen::Vector3d& proj_center1,
84  const Eigen::Vector3d& proj_center2,
85  const Eigen::Vector3d& point3D);
86 std::vector<double> CalculateTriangulationAngles(
87  const Eigen::Vector3d& proj_center1,
88  const Eigen::Vector3d& proj_center2,
89  const std::vector<Eigen::Vector3d>& points3D);
90 
91 } // namespace colmap
int points
Matrix< double, 3, 4 > Matrix3x4d
Definition: types.h:39
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)
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)