AliceVision
Photogrammetric Computer Vision Framework
Matrix3x4.hpp
1 // This file is part of the AliceVision project.
2 // Copyright (c) 2017 AliceVision contributors.
3 // This Source Code Form is subject to the terms of the Mozilla Public License,
4 // v. 2.0. If a copy of the MPL was not distributed with this file,
5 // You can obtain one at https://mozilla.org/MPL/2.0/.
6 
7 #pragma once
8 
9 #include <aliceVision/mvsData/Matrix3x3.hpp>
10 #include <aliceVision/mvsData/Point3d.hpp>
11 #include <aliceVision/mvsData/StaticVector.hpp>
12 #include <aliceVision/system/Logger.hpp>
13 
14 namespace aliceVision {
15 
16 class Matrix3x4
17 {
18  public:
19  union
20  {
21  struct
22  {
23  double m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34;
24  };
25  double m[12];
26  };
27 
28  inline Matrix3x4()
29  {
30  m11 = 0.0;
31  m12 = 0.0;
32  m13 = 0.0;
33  m14 = 0.0;
34  m21 = 0.0;
35  m22 = 0.0;
36  m23 = 0.0;
37  m24 = 0.0;
38  m31 = 0.0;
39  m32 = 0.0;
40  m33 = 0.0;
41  m34 = 0.0;
42  }
43 
44  inline Matrix3x4& operator=(const Matrix3x4& m) = default;
45 
46  inline Point3d operator*(const Point3d& _p) const
47  {
48  return Point3d(
49  m11 * _p.x + m12 * _p.y + m13 * _p.z + m14, m21 * _p.x + m22 * _p.y + m23 * _p.z + m24, m31 * _p.x + m32 * _p.y + m33 * _p.z + m34);
50  }
51 
52  inline double deteminant() const
53  {
54  return m11 * m22 * m33 - m11 * m23 * m32 - m12 * m21 * m33 + m12 * m23 * m31 + m13 * m21 * m32 - m13 * m22 * m31;
55  }
56 
57  inline Matrix3x3 sub3x3() const
58  {
59  Matrix3x3 m;
60  m.m11 = m11;
61  m.m12 = m12;
62  m.m13 = m13;
63  m.m21 = m21;
64  m.m22 = m22;
65  m.m23 = m23;
66  m.m31 = m31;
67  m.m32 = m32;
68  m.m33 = m33;
69  return m;
70  }
71 
72  inline Point3d lastColumn() const
73  {
74  Point3d m;
75  m.x = m14;
76  m.y = m24;
77  m.z = m34;
78  return m;
79  }
80 
81  void decomposeProjectionMatrix(Matrix3x3& K, Matrix3x3& R, Point3d& C) const
82  {
83  Matrix3x3 H = sub3x3();
84  H.RQ(K, R);
85 
86  const bool cam_affine = (K.m33 == 0);
87 
88  if (!cam_affine)
89  {
90  K = K / fabs(K.m33);
91  }
92  else
93  {
94  ALICEVISION_LOG_ERROR(m11 << " " << m12 << " " << m13 << " " << m14);
95  ALICEVISION_LOG_ERROR(m21 << " " << m22 << " " << m23 << " " << m24);
96  ALICEVISION_LOG_ERROR(m31 << " " << m32 << " " << m33 << " " << m34);
97  throw std::runtime_error("Matrix3x4::decomposeProjectionMatrix: affine camera.");
98  }
99 
100  if (K.m11 < 0.0f)
101  {
102  Matrix3x3 D = diag3x3(-1.0f, -1.0f, 1.0f);
103  K = K * D;
104  R = D * R;
105  }
106 
107  if (K.m22 < 0.0f)
108  {
109  Matrix3x3 D = diag3x3(1.0f, -1.0f, -1.0f);
110  K = K * D;
111  R = D * R;
112  }
113 
114  C = (-sub3x3()).mldivide(lastColumn());
115  }
116 };
117 
118 inline Matrix3x4 operator*(const Matrix3x3& M1, const Matrix3x4& M2)
119 {
120  Matrix3x4 m;
121  m.m11 = M1.m11 * M2.m11 + M1.m12 * M2.m21 + M1.m13 * M2.m31;
122  m.m12 = M1.m11 * M2.m12 + M1.m12 * M2.m22 + M1.m13 * M2.m32;
123  m.m13 = M1.m11 * M2.m13 + M1.m12 * M2.m23 + M1.m13 * M2.m33;
124  m.m14 = M1.m11 * M2.m14 + M1.m12 * M2.m24 + M1.m13 * M2.m34;
125 
126  m.m21 = M1.m21 * M2.m11 + M1.m22 * M2.m21 + M1.m23 * M2.m31;
127  m.m22 = M1.m21 * M2.m12 + M1.m22 * M2.m22 + M1.m23 * M2.m32;
128  m.m23 = M1.m21 * M2.m13 + M1.m22 * M2.m23 + M1.m23 * M2.m33;
129  m.m24 = M1.m21 * M2.m14 + M1.m22 * M2.m24 + M1.m23 * M2.m34;
130 
131  m.m31 = M1.m31 * M2.m11 + M1.m32 * M2.m21 + M1.m33 * M2.m31;
132  m.m32 = M1.m31 * M2.m12 + M1.m32 * M2.m22 + M1.m33 * M2.m32;
133  m.m33 = M1.m31 * M2.m13 + M1.m32 * M2.m23 + M1.m33 * M2.m33;
134  m.m34 = M1.m31 * M2.m14 + M1.m32 * M2.m24 + M1.m33 * M2.m34;
135 
136  return m;
137 }
138 
139 inline Matrix3x4 operator|(const Matrix3x3& M, const Point3d& p)
140 {
141  Matrix3x4 m;
142  m.m11 = M.m11;
143  m.m12 = M.m12;
144  m.m13 = M.m13;
145  m.m14 = p.x;
146  m.m21 = M.m21;
147  m.m22 = M.m22;
148  m.m23 = M.m23;
149  m.m24 = p.y;
150  m.m31 = M.m31;
151  m.m32 = M.m32;
152  m.m33 = M.m33;
153  m.m34 = p.z;
154 
155  return m;
156 }
157 
158 } // namespace aliceVision
aliceVision::Point3d
Definition: Point3d.hpp:24
aliceVision::Matrix3x4
Definition: Matrix3x4.hpp:16
aliceVision
Definition: checkerDetector.cpp:32
aliceVision::Matrix3x3
Definition: Matrix3x3.hpp:18