comparison UnitTestsSources/UnitTestsMain.cpp @ 161:197a5ddaf68c wasm

FiniteProjectiveCamera
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 14 Feb 2018 11:29:26 +0100
parents 9b83f30fc1c0
children 77715c340767
comparison
equal deleted inserted replaced
160:e9dae7e7bffc 161:197a5ddaf68c
23 #include "gtest/gtest.h" 23 #include "gtest/gtest.h"
24 24
25 #include "../Framework/Layers/FrameRenderer.h" 25 #include "../Framework/Layers/FrameRenderer.h"
26 #include "../Framework/Layers/LayerSourceBase.h" 26 #include "../Framework/Layers/LayerSourceBase.h"
27 #include "../Framework/Toolbox/DownloadStack.h" 27 #include "../Framework/Toolbox/DownloadStack.h"
28 #include "../Framework/Toolbox/FiniteProjectiveCamera.h"
28 #include "../Framework/Toolbox/OrthancSlicesLoader.h" 29 #include "../Framework/Toolbox/OrthancSlicesLoader.h"
29 #include "../Framework/Volumes/ImageBuffer3D.h" 30 #include "../Framework/Volumes/ImageBuffer3D.h"
30 #include "../Framework/Volumes/SlicedVolumeBase.h" 31 #include "../Framework/Volumes/SlicedVolumeBase.h"
31 #include "../Platforms/Generic/OracleWebService.h" 32 #include "../Platforms/Generic/OracleWebService.h"
32 33
134 135
135 136
136 TEST(GeometryToolbox, Interpolation) 137 TEST(GeometryToolbox, Interpolation)
137 { 138 {
138 // https://en.wikipedia.org/wiki/Bilinear_interpolation#Application_in_image_processing 139 // https://en.wikipedia.org/wiki/Bilinear_interpolation#Application_in_image_processing
139 ASSERT_FLOAT_EQ(146.1f, OrthancStone::GeometryToolbox::ComputeBilinearInterpolation(20.5f, 14.2f, 91, 210, 162, 95)); 140 ASSERT_FLOAT_EQ(146.1f, OrthancStone::GeometryToolbox::ComputeBilinearInterpolation
140 141 (20.5f, 14.2f, 91, 210, 162, 95));
141 ASSERT_FLOAT_EQ(123.35f, OrthancStone::GeometryToolbox::ComputeTrilinearInterpolation(20.5f, 15.2f, 5.7f, 142
142 91, 210, 162, 95, 143 ASSERT_FLOAT_EQ(123.35f, OrthancStone::GeometryToolbox::ComputeTrilinearInterpolation
143 51, 190, 80, 92)); 144 (20.5f, 15.2f, 5.7f,
145 91, 210, 162, 95,
146 51, 190, 80, 92));
147 }
148
149
150 TEST(FiniteProjectiveCamera, Decomposition)
151 {
152 // Example 6.2 of "Multiple View Geometry in Computer Vision - 2nd
153 // edition" (page 163)
154 const double p[12] = {
155 3.53553e+2, 3.39645e+2, 2.77744e+2, -1.44946e+6,
156 -1.03528e+2, 2.33212e+1, 4.59607e+2, -6.32525e+5,
157 7.07107e-1, -3.53553e-1, 6.12372e-1, -9.18559e+2
158 };
159
160 OrthancStone::FiniteProjectiveCamera camera(p);
161 ASSERT_EQ(3u, camera.GetMatrix().size1());
162 ASSERT_EQ(4u, camera.GetMatrix().size2());
163 ASSERT_EQ(3u, camera.GetIntrinsicParameters().size1());
164 ASSERT_EQ(3u, camera.GetIntrinsicParameters().size2());
165 ASSERT_EQ(3u, camera.GetRotation().size1());
166 ASSERT_EQ(3u, camera.GetRotation().size2());
167 ASSERT_EQ(3u, camera.GetCenter().size());
168
169 ASSERT_NEAR(1000.0, camera.GetCenter()[0], 0.01);
170 ASSERT_NEAR(2000.0, camera.GetCenter()[1], 0.01);
171 ASSERT_NEAR(1500.0, camera.GetCenter()[2], 0.01);
172
173 ASSERT_NEAR(468.2, camera.GetIntrinsicParameters() (0, 0), 0.1);
174 ASSERT_NEAR(91.2, camera.GetIntrinsicParameters() (0, 1), 0.1);
175 ASSERT_NEAR(300.0, camera.GetIntrinsicParameters() (0, 2), 0.1);
176 ASSERT_NEAR(427.2, camera.GetIntrinsicParameters() (1, 1), 0.1);
177 ASSERT_NEAR(200.0, camera.GetIntrinsicParameters() (1, 2), 0.1);
178 ASSERT_NEAR(1.0, camera.GetIntrinsicParameters() (2, 2), 0.1);
179
180 ASSERT_NEAR(0, camera.GetIntrinsicParameters() (1, 0), 0.0000001);
181 ASSERT_NEAR(0, camera.GetIntrinsicParameters() (2, 0), 0.0000001);
182 ASSERT_NEAR(0, camera.GetIntrinsicParameters() (2, 1), 0.0000001);
183
184 ASSERT_NEAR(0.41380, camera.GetRotation() (0, 0), 0.00001);
185 ASSERT_NEAR(0.90915, camera.GetRotation() (0, 1), 0.00001);
186 ASSERT_NEAR(0.04708, camera.GetRotation() (0, 2), 0.00001);
187 ASSERT_NEAR(-0.57338, camera.GetRotation() (1, 0), 0.00001);
188 ASSERT_NEAR(0.22011, camera.GetRotation() (1, 1), 0.00001);
189 ASSERT_NEAR(0.78917, camera.GetRotation() (1, 2), 0.00001);
190 ASSERT_NEAR(0.70711, camera.GetRotation() (2, 0), 0.00001);
191 ASSERT_NEAR(-0.35355, camera.GetRotation() (2, 1), 0.00001);
192 ASSERT_NEAR(0.61237, camera.GetRotation() (2, 2), 0.00001);
193
194 ASSERT_TRUE(OrthancStone::LinearAlgebra::IsRotationMatrix(camera.GetRotation()));
195
196 OrthancStone::FiniteProjectiveCamera camera2(camera.GetIntrinsicParameters(),
197 camera.GetRotation(),
198 camera.GetCenter());
199 ASSERT_EQ(3u, camera2.GetMatrix().size1());
200 ASSERT_EQ(4u, camera2.GetMatrix().size2());
201 ASSERT_EQ(3u, camera2.GetIntrinsicParameters().size1());
202 ASSERT_EQ(3u, camera2.GetIntrinsicParameters().size2());
203 ASSERT_EQ(3u, camera2.GetRotation().size1());
204 ASSERT_EQ(3u, camera2.GetRotation().size2());
205 ASSERT_EQ(3u, camera2.GetCenter().size());
206
207 for (size_t i = 0; i < 3; i++)
208 {
209 for (size_t j = 0; j < 4; j++)
210 {
211 ASSERT_NEAR(camera.GetMatrix() (i, j),
212 camera2.GetMatrix() (i, j), 0.00000001);
213 }
214 }
144 } 215 }
145 216
146 217
147 int main(int argc, char **argv) 218 int main(int argc, char **argv)
148 { 219 {