projection
StereoTriangulation.hpp
Go to the documentation of this file.
1 #ifndef PROJECTION_TRIANGULATION_HPP__
2 #define PROJECTION_TRIANGULATION_HPP__
3 
4 #include <Eigen/Core>
5 #include <Eigen/Geometry>
6 #include <cmath>
7 
8 namespace projection
9 {
11 {
12  Eigen::Isometry3d trans;
13  Eigen::Vector3d scenePoint;
14  double error;
15 
16  Eigen::Vector3d direction;
17 
18  Eigen::Vector3d xl, xr;
19  Eigen::Vector3d vl, vr;
20 
22  : trans( Eigen::Isometry3d::Identity() ),
23  scenePoint( Eigen::Vector3d::Zero() ),
24  error( 0.0 )
25  {}
26 
27  void setTransform( const Eigen::Isometry3d& camr2caml )
28  {
29  trans = camr2caml;
30  }
31 
32  void calcScenePoint( const Eigen::Vector2d& p1, const Eigen::Vector2d& p2 )
33  {
34  // get homogenous coordinates
35  xl << p1, 1;
36  xr << p2, 1;
37 
38  // get the transform from a to b
39  Eigen::Quaterniond R(trans.rotation());
40  Eigen::Vector3d T(trans.translation());
41 
42  // now calculate the triangulation by solving a linear system
43  Eigen::Matrix<double,3,3> A;
44  A << xl, -(R.inverse()*xr), (xl.cross(R.inverse()*xr-T)-T);
45  Eigen::Vector3d b;
46  b = -(R.inverse()*T);
47  Eigen::Vector3d param = A.colPivHouseholderQr().solve(b);
48 
49  Eigen::Vector3d Vp = param[2]*(xl.cross(R.inverse()*xr-T)-T);
50  Eigen::Vector3d Xl = xl * param[0];
51 
52  scenePoint = Xl + 0.5 * Vp;
53  error = 0.5 * Vp.norm();
54  }
55 
56  void calcDirection( double a1, double a2 )
57  {
58  // calc angle vectors
59  vl << std::cos(a1), std::sin(a1), 0;
60  vr << std::cos(a2), std::sin(a2), 0;
61 
62  Eigen::Quaterniond R(trans.rotation());
63  Eigen::Matrix<double,3,3> A;
64  A << xl, vl, -(R.inverse()*(xr+vr));
65  Eigen::Vector3d b = Eigen::Vector3d::Zero();
66  Eigen::Vector3d param = A.colPivHouseholderQr().solve(b);
67 
68  Eigen::Vector3d v = param[0] * xl + param[1] * vl;
69  direction = v.normalized();
70  }
71 
72  Eigen::Vector3d getScenePoint() const
73  {
74  return scenePoint;
75  }
76 
77  Eigen::Vector3d getDirection() const
78  {
79  return direction;
80  }
81 
82  double getError() const
83  {
84  return error;
85  }
86 
87 };
88 }
89 
90 #endif
Eigen::Vector3d scenePoint
Definition: StereoTriangulation.hpp:13
StereoTriangulation()
Definition: StereoTriangulation.hpp:21
Eigen::Vector3d vl
Definition: StereoTriangulation.hpp:19
void calcDirection(double a1, double a2)
Definition: StereoTriangulation.hpp:56
Eigen::Vector3d direction
Definition: StereoTriangulation.hpp:16
void calcScenePoint(const Eigen::Vector2d &p1, const Eigen::Vector2d &p2)
Definition: StereoTriangulation.hpp:32
double getError() const
Definition: StereoTriangulation.hpp:82
Eigen::Vector3d xr
Definition: StereoTriangulation.hpp:18
Definition: StereoTriangulation.hpp:10
Eigen::Vector3d getScenePoint() const
Definition: StereoTriangulation.hpp:72
Eigen::Isometry3d trans
Definition: StereoTriangulation.hpp:12
double error
Definition: StereoTriangulation.hpp:14
Eigen::Vector3d vr
Definition: StereoTriangulation.hpp:19
Eigen::Vector3d xl
Definition: StereoTriangulation.hpp:18
void setTransform(const Eigen::Isometry3d &camr2caml)
Definition: StereoTriangulation.hpp:27
Eigen::Vector3d getDirection() const
Definition: StereoTriangulation.hpp:77
Definition: Homography.hpp:8