comparison OrthancStone/Sources/Toolbox/FiniteProjectiveCamera.h @ 1512:244ad1e4e76a

reorganization of folders
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 07 Jul 2020 16:21:02 +0200
parents Framework/Toolbox/FiniteProjectiveCamera.h@2d8ab34c8c91
children 85e117739eca
comparison
equal deleted inserted replaced
1511:9dfeee74c1e6 1512:244ad1e4e76a
1 /**
2 * Stone of Orthanc
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
4 * Department, University Hospital of Liege, Belgium
5 * Copyright (C) 2017-2020 Osimis S.A., Belgium
6 *
7 * This program is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU Affero General Public License
9 * as published by the Free Software Foundation, either version 3 of
10 * the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Affero General Public License for more details.
16 *
17 * You should have received a copy of the GNU Affero General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 **/
20
21
22 #pragma once
23
24 #include "LinearAlgebra.h"
25 #include "../Volumes/ImageBuffer3D.h"
26 #include "../Volumes/VolumeImageGeometry.h"
27
28 namespace OrthancStone
29 {
30 // Reference: "Multiple View Geometry in Computer Vision (2nd Edition)"
31 class FiniteProjectiveCamera : public boost::noncopyable
32 {
33 private:
34 Matrix p_; // 3x4 matrix - Equation (6.11) - page 157
35 Matrix k_; // 3x3 matrix of intrinsic parameters - Equation (6.10) - page 157
36 Matrix r_; // 3x3 rotation matrix in 3D space
37 Vector c_; // 3x1 vector in 3D space corresponding to camera center
38 Matrix minv_; // Inverse of the M = P(1:3,1:3) submatrix
39
40 void ComputeMInverse();
41
42 void Setup(const Matrix& k,
43 const Matrix& r,
44 const Vector& c);
45
46 void Setup(const Matrix& p);
47
48 public:
49 FiniteProjectiveCamera(const Matrix& k,
50 const Matrix& r,
51 const Vector& c)
52 {
53 Setup(k, r, c);
54 }
55
56 FiniteProjectiveCamera(const Matrix& p)
57 {
58 Setup(p);
59 }
60
61 FiniteProjectiveCamera(const double k[9],
62 const double r[9],
63 const double c[3]);
64
65 FiniteProjectiveCamera(const double p[12]);
66
67 // Constructor that implements camera calibration
68 FiniteProjectiveCamera(const Vector& camera,
69 const Vector& principalPoint,
70 double angle,
71 unsigned int imageWidth,
72 unsigned int imageHeight,
73 double pixelSpacingX,
74 double pixelSpacingY);
75
76 const Matrix& GetMatrix() const
77 {
78 return p_;
79 }
80
81 const Matrix& GetRotation() const
82 {
83 return r_;
84 }
85
86 const Vector& GetCenter() const
87 {
88 return c_;
89 }
90
91 const Matrix& GetIntrinsicParameters() const
92 {
93 return k_;
94 }
95
96 // Computes the 3D vector that represents the direction from the
97 // camera center to the (x,y) imaged point
98 Vector GetRayDirection(double x,
99 double y) const;
100
101 // Apply the camera to a 3D point "v" that is not at infinity. "v"
102 // can be encoded either as a non-homogeneous vector (3
103 // components), or as a homogeneous vector (4 components).
104 void ApplyFinite(double& x,
105 double& y,
106 const Vector& v) const;
107
108 // Apply the camera to a 3D point "v" that is possibly at
109 // infinity. The result is a 2D point in homogeneous coordinates.
110 Vector ApplyGeneral(const Vector& v) const;
111
112 Orthanc::ImageAccessor* ApplyRaytracer(const ImageBuffer3D& source,
113 const VolumeImageGeometry& geometry,
114 Orthanc::PixelFormat targetFormat,
115 unsigned int targetWidth,
116 unsigned int targetHeight,
117 bool mip) const;
118 };
119 }