ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
image_test.cc
Go to the documentation of this file.
1 // Copyright (c) 2018, ETH Zurich and UNC Chapel Hill.
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are met:
6 //
7 // * Redistributions of source code must retain the above copyright
8 // notice, this list of conditions and the following disclaimer.
9 //
10 // * Redistributions in binary form must reproduce the above copyright
11 // notice, this list of conditions and the following disclaimer in the
12 // documentation and/or other materials provided with the distribution.
13 //
14 // * Neither the name of ETH Zurich and UNC Chapel Hill nor the names of
15 // its contributors may be used to endorse or promote products derived
16 // from this software without specific prior written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
22 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 // POSSIBILITY OF SUCH DAMAGE.
29 //
30 // Author: Johannes L. Schoenberger (jsch-at-demuc-dot-de)
31 
32 #define TEST_NAME "base/image"
33 #include "util/testing.h"
34 
35 #include "base/image.h"
36 
37 using namespace colmap;
38 
39 BOOST_AUTO_TEST_CASE(TestDefault) {
40  Image image;
41  BOOST_CHECK_EQUAL(image.ImageId(), kInvalidImageId);
42  BOOST_CHECK_EQUAL(image.Name(), "");
43  BOOST_CHECK_EQUAL(image.CameraId(), kInvalidCameraId);
44  BOOST_CHECK_EQUAL(image.HasCamera(), false);
45  BOOST_CHECK_EQUAL(image.IsRegistered(), false);
46  BOOST_CHECK_EQUAL(image.NumPoints2D(), 0);
47  BOOST_CHECK_EQUAL(image.NumPoints3D(), 0);
48  BOOST_CHECK_EQUAL(image.NumObservations(), 0);
49  BOOST_CHECK_EQUAL(image.NumCorrespondences(), 0);
50  BOOST_CHECK_EQUAL(image.NumVisiblePoints3D(), 0);
51  BOOST_CHECK_EQUAL(image.Point3DVisibilityScore(), 0);
52  BOOST_CHECK_EQUAL(image.Qvec(0), 1.0);
53  BOOST_CHECK_EQUAL(image.Qvec(1), 0.0);
54  BOOST_CHECK_EQUAL(image.Qvec(2), 0.0);
55  BOOST_CHECK_EQUAL(image.Qvec(3), 0.0);
56  BOOST_CHECK(IsNaN(image.QvecPrior(0)));
57  BOOST_CHECK(IsNaN(image.QvecPrior(1)));
58  BOOST_CHECK(IsNaN(image.QvecPrior(2)));
59  BOOST_CHECK(IsNaN(image.QvecPrior(3)));
60  BOOST_CHECK_EQUAL(image.Tvec(0), 0.0);
61  BOOST_CHECK_EQUAL(image.Tvec(1), 0.0);
62  BOOST_CHECK_EQUAL(image.Tvec(2), 0.0);
63  BOOST_CHECK(IsNaN(image.TvecPrior(0)));
64  BOOST_CHECK(IsNaN(image.TvecPrior(1)));
65  BOOST_CHECK(IsNaN(image.TvecPrior(2)));
66  BOOST_CHECK_EQUAL(image.HasQvecPrior(), false);
67  BOOST_CHECK_EQUAL(image.HasTvecPrior(), false);
68  BOOST_CHECK_EQUAL(image.Points2D().size(), 0);
69 }
70 
71 BOOST_AUTO_TEST_CASE(TestImageId) {
72  Image image;
73  BOOST_CHECK_EQUAL(image.ImageId(), kInvalidImageId);
74  image.SetImageId(1);
75  BOOST_CHECK_EQUAL(image.ImageId(), 1);
76 }
77 
79  Image image;
80  BOOST_CHECK_EQUAL(image.Name(), "");
81  image.SetName("test1");
82  BOOST_CHECK_EQUAL(image.Name(), "test1");
83  image.Name() = "test2";
84  BOOST_CHECK_EQUAL(image.Name(), "test2");
85 }
86 
87 BOOST_AUTO_TEST_CASE(TestCameraId) {
88  Image image;
89  BOOST_CHECK_EQUAL(image.CameraId(), kInvalidCameraId);
90  image.SetCameraId(1);
91  BOOST_CHECK_EQUAL(image.CameraId(), 1);
92 }
93 
94 BOOST_AUTO_TEST_CASE(TestRegistered) {
95  Image image;
96  BOOST_CHECK_EQUAL(image.IsRegistered(), false);
97  image.SetRegistered(true);
98  BOOST_CHECK_EQUAL(image.IsRegistered(), true);
99  image.SetRegistered(false);
100  BOOST_CHECK_EQUAL(image.IsRegistered(), false);
101 }
102 
103 BOOST_AUTO_TEST_CASE(TestNumPoints2D) {
104  Image image;
105  BOOST_CHECK_EQUAL(image.NumPoints2D(), 0);
106  image.SetPoints2D(std::vector<Eigen::Vector2d>(10));
107  BOOST_CHECK_EQUAL(image.NumPoints2D(), 10);
108 }
109 
110 BOOST_AUTO_TEST_CASE(TestNumPoints3D) {
111  Image image;
112  image.SetPoints2D(std::vector<Eigen::Vector2d>(10));
113  BOOST_CHECK_EQUAL(image.NumPoints3D(), 0);
114  image.SetPoint3DForPoint2D(0, 0);
115  BOOST_CHECK_EQUAL(image.NumPoints3D(), 1);
116  image.SetPoint3DForPoint2D(0, 1);
117  image.SetPoint3DForPoint2D(1, 2);
118  BOOST_CHECK_EQUAL(image.NumPoints3D(), 2);
119 }
120 
121 BOOST_AUTO_TEST_CASE(TestNumObservations) {
122  Image image;
123  BOOST_CHECK_EQUAL(image.NumObservations(), 0);
124  image.SetNumObservations(10);
125  BOOST_CHECK_EQUAL(image.NumObservations(), 10);
126 }
127 
128 BOOST_AUTO_TEST_CASE(TestNumCorrespondences) {
129  Image image;
130  BOOST_CHECK_EQUAL(image.NumCorrespondences(), 0);
131  image.SetNumCorrespondences(10);
132  BOOST_CHECK_EQUAL(image.NumCorrespondences(), 10);
133 }
134 
135 BOOST_AUTO_TEST_CASE(TestNumVisiblePoints3D) {
136  Image image;
137  image.SetPoints2D(std::vector<Eigen::Vector2d>(10));
138  image.SetNumObservations(10);
139  Camera camera;
140  camera.SetWidth(10);
141  camera.SetHeight(10);
142  image.SetUp(camera);
143  BOOST_CHECK_EQUAL(image.NumVisiblePoints3D(), 0);
144  image.IncrementCorrespondenceHasPoint3D(0);
145  BOOST_CHECK_EQUAL(image.NumVisiblePoints3D(), 1);
146  image.IncrementCorrespondenceHasPoint3D(0);
147  image.IncrementCorrespondenceHasPoint3D(1);
148  BOOST_CHECK_EQUAL(image.NumVisiblePoints3D(), 2);
149  image.DecrementCorrespondenceHasPoint3D(0);
150  BOOST_CHECK_EQUAL(image.NumVisiblePoints3D(), 2);
151  image.DecrementCorrespondenceHasPoint3D(0);
152  BOOST_CHECK_EQUAL(image.NumVisiblePoints3D(), 1);
153  image.DecrementCorrespondenceHasPoint3D(1);
154  BOOST_CHECK_EQUAL(image.NumVisiblePoints3D(), 0);
155 }
156 
157 BOOST_AUTO_TEST_CASE(TestPoint3DVisibilityScore) {
158  Image image;
159  std::vector<Eigen::Vector2d> points2D;
160  for (size_t i = 0; i < 4; ++i) {
161  for (size_t j = 0; j < 4; ++j) {
162  points2D.emplace_back(i, j);
163  }
164  }
165  image.SetPoints2D(points2D);
166  image.SetNumObservations(16);
167  Camera camera;
168  camera.SetWidth(4);
169  camera.SetHeight(4);
170  image.SetUp(camera);
171  Eigen::Matrix<size_t, Eigen::Dynamic, 1> scores(
172  image.kNumPoint3DVisibilityPyramidLevels, 1);
173  for (int i = 1; i <= image.kNumPoint3DVisibilityPyramidLevels; ++i) {
174  scores(i - 1) = (1 << i) * (1 << i);
175  }
176  BOOST_CHECK_EQUAL(image.Point3DVisibilityScore(), 0);
177  image.IncrementCorrespondenceHasPoint3D(0);
178  BOOST_CHECK_EQUAL(image.Point3DVisibilityScore(), scores.sum());
179  image.IncrementCorrespondenceHasPoint3D(0);
180  BOOST_CHECK_EQUAL(image.Point3DVisibilityScore(), scores.sum());
181  image.IncrementCorrespondenceHasPoint3D(1);
182  BOOST_CHECK_EQUAL(image.Point3DVisibilityScore(),
183  scores.sum() + scores.bottomRows(scores.size() - 1).sum());
184  image.IncrementCorrespondenceHasPoint3D(1);
185  image.IncrementCorrespondenceHasPoint3D(1);
186  image.IncrementCorrespondenceHasPoint3D(4);
187  BOOST_CHECK_EQUAL(
188  image.Point3DVisibilityScore(),
189  scores.sum() + 2 * scores.bottomRows(scores.size() - 1).sum());
190  image.IncrementCorrespondenceHasPoint3D(4);
191  image.IncrementCorrespondenceHasPoint3D(5);
192  BOOST_CHECK_EQUAL(
193  image.Point3DVisibilityScore(),
194  scores.sum() + 3 * scores.bottomRows(scores.size() - 1).sum());
195  image.DecrementCorrespondenceHasPoint3D(0);
196  BOOST_CHECK_EQUAL(
197  image.Point3DVisibilityScore(),
198  scores.sum() + 3 * scores.bottomRows(scores.size() - 1).sum());
199  image.DecrementCorrespondenceHasPoint3D(0);
200  BOOST_CHECK_EQUAL(
201  image.Point3DVisibilityScore(),
202  scores.sum() + 2 * scores.bottomRows(scores.size() - 1).sum());
203  image.IncrementCorrespondenceHasPoint3D(2);
204  BOOST_CHECK_EQUAL(
205  image.Point3DVisibilityScore(),
206  2 * scores.sum() + 2 * scores.bottomRows(scores.size() - 1).sum());
207 }
208 
210  Image image;
211  BOOST_CHECK_EQUAL(image.Qvec(0), 1.0);
212  BOOST_CHECK_EQUAL(image.Qvec(1), 0.0);
213  BOOST_CHECK_EQUAL(image.Qvec(2), 0.0);
214  BOOST_CHECK_EQUAL(image.Qvec(3), 0.0);
215  image.Qvec(0) = 2.0;
216  BOOST_CHECK_EQUAL(image.Qvec(0), 2.0);
217  image.SetQvec(Eigen::Vector4d(3.0, 0.0, 0.0, 0.0));
218  BOOST_CHECK_EQUAL(image.Qvec(0), 3.0);
219  image.Qvec() = Eigen::Vector4d(4.0, 0.0, 0.0, 0.0);
220  BOOST_CHECK_EQUAL(image.Qvec(0), 4.0);
221 }
222 
223 BOOST_AUTO_TEST_CASE(TestQvecPrior) {
224  Image image;
225  BOOST_CHECK(IsNaN(image.QvecPrior(0)));
226  BOOST_CHECK(IsNaN(image.QvecPrior(1)));
227  BOOST_CHECK(IsNaN(image.QvecPrior(2)));
228  BOOST_CHECK(IsNaN(image.QvecPrior(3)));
229  BOOST_CHECK_EQUAL(image.HasQvecPrior(), false);
230  image.QvecPrior(0) = 2.0;
231  BOOST_CHECK_EQUAL(image.HasQvecPrior(), false);
232  image.QvecPrior(1) = 2.0;
233  BOOST_CHECK_EQUAL(image.HasQvecPrior(), false);
234  image.QvecPrior(2) = 2.0;
235  BOOST_CHECK_EQUAL(image.HasQvecPrior(), false);
236  image.QvecPrior(3) = 2.0;
237  BOOST_CHECK_EQUAL(image.HasQvecPrior(), true);
238  BOOST_CHECK_EQUAL(image.QvecPrior(0), 2.0);
239  BOOST_CHECK_EQUAL(image.QvecPrior(1), 2.0);
240  BOOST_CHECK_EQUAL(image.QvecPrior(2), 2.0);
241  BOOST_CHECK_EQUAL(image.QvecPrior(3), 2.0);
242  image.SetQvecPrior(Eigen::Vector4d(3.0, 0.0, 0.0, 0.0));
243  BOOST_CHECK_EQUAL(image.QvecPrior(0), 3.0);
244  image.QvecPrior() = Eigen::Vector4d(4.0, 0.0, 0.0, 0.0);
245  BOOST_CHECK_EQUAL(image.QvecPrior(0), 4.0);
246 }
247 
249  Image image;
250  BOOST_CHECK_EQUAL(image.Tvec(0), 0.0);
251  BOOST_CHECK_EQUAL(image.Tvec(1), 0.0);
252  BOOST_CHECK_EQUAL(image.Tvec(2), 0.0);
253  image.Tvec(0) = 2.0;
254  BOOST_CHECK_EQUAL(image.Tvec(0), 2.0);
255  image.SetTvec(Eigen::Vector3d(3.0, 0.0, 0.0));
256  BOOST_CHECK_EQUAL(image.Tvec(0), 3.0);
257  image.Tvec() = Eigen::Vector3d(4.0, 0.0, 0.0);
258  BOOST_CHECK_EQUAL(image.Tvec(0), 4.0);
259 }
260 
261 BOOST_AUTO_TEST_CASE(TestTvecPrior) {
262  Image image;
263  BOOST_CHECK(IsNaN(image.TvecPrior(0)));
264  BOOST_CHECK(IsNaN(image.TvecPrior(1)));
265  BOOST_CHECK(IsNaN(image.TvecPrior(2)));
266  BOOST_CHECK_EQUAL(image.HasTvecPrior(), false);
267  image.TvecPrior(0) = 2.0;
268  BOOST_CHECK_EQUAL(image.HasTvecPrior(), false);
269  image.TvecPrior(1) = 2.0;
270  BOOST_CHECK_EQUAL(image.HasTvecPrior(), false);
271  image.TvecPrior(2) = 2.0;
272  BOOST_CHECK_EQUAL(image.HasTvecPrior(), true);
273  BOOST_CHECK_EQUAL(image.TvecPrior(0), 2.0);
274  BOOST_CHECK_EQUAL(image.TvecPrior(1), 2.0);
275  BOOST_CHECK_EQUAL(image.TvecPrior(2), 2.0);
276  image.SetTvecPrior(Eigen::Vector3d(3.0, 0.0, 0.0));
277  BOOST_CHECK_EQUAL(image.TvecPrior(0), 3.0);
278  image.TvecPrior() = Eigen::Vector3d(4.0, 0.0, 0.0);
279  BOOST_CHECK_EQUAL(image.TvecPrior(0), 4.0);
280 }
281 
282 BOOST_AUTO_TEST_CASE(TestPoints2D) {
283  Image image;
284  BOOST_CHECK_EQUAL(image.Points2D().size(), 0);
285  std::vector<Eigen::Vector2d> points2D(10);
286  points2D[0] = Eigen::Vector2d(1.0, 2.0);
287  image.SetPoints2D(points2D);
288  BOOST_CHECK_EQUAL(image.Points2D().size(), 10);
289  BOOST_CHECK_EQUAL(image.Point2D(0).X(), 1.0);
290  BOOST_CHECK_EQUAL(image.Point2D(0).Y(), 2.0);
291 }
292 
293 BOOST_AUTO_TEST_CASE(TestPoint3D) {
294  Image image;
295  image.SetPoints2D(std::vector<Eigen::Vector2d>(2));
296  BOOST_CHECK(!image.Point2D(0).HasPoint3D());
297  BOOST_CHECK(!image.Point2D(1).HasPoint3D());
298  BOOST_CHECK_EQUAL(image.NumPoints3D(), 0);
299  image.SetPoint3DForPoint2D(0, 0);
300  BOOST_CHECK(image.Point2D(0).HasPoint3D());
301  BOOST_CHECK(!image.Point2D(1).HasPoint3D());
302  BOOST_CHECK_EQUAL(image.NumPoints3D(), 1);
303  BOOST_CHECK(image.HasPoint3D(0));
304  image.SetPoint3DForPoint2D(0, 1);
305  BOOST_CHECK(image.Point2D(0).HasPoint3D());
306  BOOST_CHECK(!image.Point2D(1).HasPoint3D());
307  BOOST_CHECK_EQUAL(image.NumPoints3D(), 1);
308  BOOST_CHECK(!image.HasPoint3D(0));
309  BOOST_CHECK(image.HasPoint3D(1));
310  image.SetPoint3DForPoint2D(1, 0);
311  BOOST_CHECK(image.Point2D(0).HasPoint3D());
312  BOOST_CHECK(image.Point2D(1).HasPoint3D());
313  BOOST_CHECK_EQUAL(image.NumPoints3D(), 2);
314  BOOST_CHECK(image.HasPoint3D(0));
315  BOOST_CHECK(image.HasPoint3D(1));
316  image.ResetPoint3DForPoint2D(0);
317  BOOST_CHECK(!image.Point2D(0).HasPoint3D());
318  BOOST_CHECK(image.Point2D(1).HasPoint3D());
319  BOOST_CHECK_EQUAL(image.NumPoints3D(), 1);
320  BOOST_CHECK(image.HasPoint3D(0));
321  BOOST_CHECK(!image.HasPoint3D(1));
322  image.ResetPoint3DForPoint2D(1);
323  BOOST_CHECK(!image.Point2D(0).HasPoint3D());
324  BOOST_CHECK(!image.Point2D(1).HasPoint3D());
325  BOOST_CHECK_EQUAL(image.NumPoints3D(), 0);
326  BOOST_CHECK(!image.HasPoint3D(0));
327  BOOST_CHECK(!image.HasPoint3D(1));
328  image.ResetPoint3DForPoint2D(0);
329  BOOST_CHECK(!image.Point2D(0).HasPoint3D());
330  BOOST_CHECK(!image.Point2D(1).HasPoint3D());
331  BOOST_CHECK_EQUAL(image.NumPoints3D(), 0);
332  BOOST_CHECK(!image.HasPoint3D(0));
333  BOOST_CHECK(!image.HasPoint3D(1));
334 }
335 
336 BOOST_AUTO_TEST_CASE(TestNormalizeQvec) {
337  Image image;
338  BOOST_CHECK_LT(std::abs(image.Qvec().norm() - 1.0), 1e-10);
339  image.Qvec(0) = 2.0;
340  BOOST_CHECK_LT(std::abs(image.Qvec().norm() - 2.0), 1e-10);
341  image.NormalizeQvec();
342  BOOST_CHECK_LT(std::abs(image.Qvec().norm() - 1.0), 1e-10);
343 }
344 
345 BOOST_AUTO_TEST_CASE(TestProjectionMatrix) {
346  Image image;
347  BOOST_CHECK(image.ProjectionMatrix().isApprox(Eigen::Matrix3x4d::Identity()));
348 }
349 
350 BOOST_AUTO_TEST_CASE(TestInverseProjectionMatrix) {
351  Image image;
352  BOOST_CHECK(
353  image.InverseProjectionMatrix().isApprox(Eigen::Matrix3x4d::Identity()));
354 }
355 
356 BOOST_AUTO_TEST_CASE(TestRotationMatrix) {
357  Image image;
358  BOOST_CHECK(image.RotationMatrix().isApprox(Eigen::Matrix3d::Identity()));
359 }
360 
361 BOOST_AUTO_TEST_CASE(TestProjectionCenter) {
362  Image image;
363  BOOST_CHECK(image.ProjectionCenter().isApprox(Eigen::Vector3d::Zero()));
364 }
365 
366 BOOST_AUTO_TEST_CASE(TestViewingDirection) {
367  Image image;
368  BOOST_CHECK(image.ViewingDirection().isApprox(Eigen::Vector3d(0, 0, 1)));
369 }
std::shared_ptr< core::Tensor > image
void SetWidth(const size_t width)
Definition: camera.h:164
void SetHeight(const size_t height)
Definition: camera.h:166
const double * e
BOOST_AUTO_TEST_CASE(TestDefault)
Definition: image_test.cc:39
const camera_t kInvalidCameraId
Definition: types.h:75
const image_t kInvalidImageId
Definition: types.h:76
bool IsNaN(const float x)
Definition: math.h:160