Mercurial > hg > orthanc-stone
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 { |