ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
database_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/database"
33 #include "util/testing.h"
34 
35 #include <thread>
36 
37 #include "base/database.h"
38 #include "base/pose.h"
39 
40 using namespace colmap;
41 
42 const static std::string kMemoryDatabasePath = ":memory:";
43 
44 BOOST_AUTO_TEST_CASE(TestOpenCloseConstructorDestructor) {
45  Database database(kMemoryDatabasePath);
46 }
47 
48 BOOST_AUTO_TEST_CASE(TestOpenClose) {
49  Database database(kMemoryDatabasePath);
50  database.Close();
51 }
52 
53 BOOST_AUTO_TEST_CASE(TestTransaction) {
54  Database database(kMemoryDatabasePath);
55  DatabaseTransaction database_transaction(&database);
56 }
57 
58 BOOST_AUTO_TEST_CASE(TestTransactionMultiThreaded) {
59  Database database(kMemoryDatabasePath);
60 
61  std::thread thread1([&database]() {
62  DatabaseTransaction database_transaction(&database);
63  std::this_thread::sleep_for(std::chrono::milliseconds(100));
64  });
65 
66  std::thread thread2([&database]() {
67  DatabaseTransaction database_transaction(&database);
68  std::this_thread::sleep_for(std::chrono::milliseconds(100));
69  });
70 
71  thread1.join();
72  thread2.join();
73 }
74 
76  Database database(kMemoryDatabasePath);
77  BOOST_CHECK_EQUAL(database.NumCameras(), 0);
78  BOOST_CHECK_EQUAL(database.NumImages(), 0);
79  BOOST_CHECK_EQUAL(database.NumKeypoints(), 0);
80  BOOST_CHECK_EQUAL(database.MaxNumKeypoints(), 0);
81  BOOST_CHECK_EQUAL(database.NumDescriptors(), 0);
82  BOOST_CHECK_EQUAL(database.MaxNumDescriptors(), 0);
83  BOOST_CHECK_EQUAL(database.NumMatches(), 0);
84  BOOST_CHECK_EQUAL(database.NumMatchedImagePairs(), 0);
85  BOOST_CHECK_EQUAL(database.NumVerifiedImagePairs(), 0);
86 }
87 
88 BOOST_AUTO_TEST_CASE(TestImagePairToPairId) {
89  BOOST_CHECK_EQUAL(Database::ImagePairToPairId(0, 0), 0);
90  BOOST_CHECK_EQUAL(Database::ImagePairToPairId(0, 1), 1);
91  BOOST_CHECK_EQUAL(Database::ImagePairToPairId(0, 2), 2);
92  BOOST_CHECK_EQUAL(Database::ImagePairToPairId(0, 3), 3);
93  BOOST_CHECK_EQUAL(Database::ImagePairToPairId(1, 2),
95  for (image_t i = 0; i < 20; ++i) {
96  for (image_t j = 0; j < 20; ++j) {
97  const image_pair_t pair_id = Database::ImagePairToPairId(i, j);
98  image_t image_id1;
99  image_t image_id2;
100  Database::PairIdToImagePair(pair_id, &image_id1, &image_id2);
101  if (i < j) {
102  BOOST_CHECK_EQUAL(i, image_id1);
103  BOOST_CHECK_EQUAL(j, image_id2);
104  } else {
105  BOOST_CHECK_EQUAL(i, image_id2);
106  BOOST_CHECK_EQUAL(j, image_id1);
107  }
108  }
109  }
110 }
111 
112 BOOST_AUTO_TEST_CASE(TestSwapImagePair) {
113  BOOST_CHECK(!Database::SwapImagePair(0, 0));
114  BOOST_CHECK(!Database::SwapImagePair(0, 1));
115  BOOST_CHECK(Database::SwapImagePair(1, 0));
116  BOOST_CHECK(!Database::SwapImagePair(1, 1));
117 }
118 
119 BOOST_AUTO_TEST_CASE(TestCamera) {
120  Database database(kMemoryDatabasePath);
121  BOOST_CHECK_EQUAL(database.NumCameras(), 0);
122  Camera camera;
123  camera.InitializeWithName("SIMPLE_PINHOLE", 1.0, 1, 1);
124  camera.SetCameraId(database.WriteCamera(camera));
125  BOOST_CHECK_EQUAL(database.NumCameras(), 1);
126  BOOST_CHECK_EQUAL(database.ExistsCamera(camera.CameraId()), true);
127  BOOST_CHECK_EQUAL(database.ReadCamera(camera.CameraId()).CameraId(),
128  camera.CameraId());
129  BOOST_CHECK_EQUAL(database.ReadCamera(camera.CameraId()).ModelId(),
130  camera.ModelId());
131  BOOST_CHECK_EQUAL(database.ReadCamera(camera.CameraId()).FocalLength(),
132  camera.FocalLength());
133  BOOST_CHECK_EQUAL(database.ReadCamera(camera.CameraId()).PrincipalPointX(),
134  camera.PrincipalPointX());
135  BOOST_CHECK_EQUAL(database.ReadCamera(camera.CameraId()).PrincipalPointY(),
136  camera.PrincipalPointY());
137  camera.SetFocalLength(2.0);
138  database.UpdateCamera(camera);
139  BOOST_CHECK_EQUAL(database.ReadCamera(camera.CameraId()).FocalLength(),
140  camera.FocalLength());
141  Camera camera2 = camera;
142  camera2.SetCameraId(camera.CameraId() + 1);
143  database.WriteCamera(camera2, true);
144  BOOST_CHECK_EQUAL(database.NumCameras(), 2);
145  BOOST_CHECK_EQUAL(database.ExistsCamera(camera.CameraId()), true);
146  BOOST_CHECK_EQUAL(database.ExistsCamera(camera2.CameraId()), true);
147  BOOST_CHECK_EQUAL(database.ReadAllCameras().size(), 2);
148  BOOST_CHECK_EQUAL(database.ReadAllCameras()[0].CameraId(), camera.CameraId());
149  BOOST_CHECK_EQUAL(database.ReadAllCameras()[1].CameraId(),
150  camera2.CameraId());
151  database.ClearCameras();
152  BOOST_CHECK_EQUAL(database.NumCameras(), 0);
153 }
154 
156  Database database(kMemoryDatabasePath);
157  Camera camera;
158  camera.InitializeWithName("SIMPLE_PINHOLE", 1.0, 1, 1);
159  camera.SetCameraId(database.WriteCamera(camera));
160  BOOST_CHECK_EQUAL(database.NumImages(), 0);
161  Image image;
162  image.SetName("test");
163  image.SetCameraId(camera.CameraId());
164  image.SetQvecPrior(Eigen::Vector4d(0.1, 0.2, 0.3, 0.4));
165  image.SetTvecPrior(Eigen::Vector3d(0.1, 0.2, 0.3));
166  image.SetImageId(database.WriteImage(image));
167  BOOST_CHECK_EQUAL(database.NumImages(), 1);
168  BOOST_CHECK_EQUAL(database.ExistsImage(image.ImageId()), true);
169  BOOST_CHECK_EQUAL(database.ReadImage(image.ImageId()).ImageId(),
170  image.ImageId());
171  BOOST_CHECK_EQUAL(database.ReadImage(image.ImageId()).CameraId(),
172  image.CameraId());
173  BOOST_CHECK_EQUAL(database.ReadImage(image.ImageId()).QvecPrior(0),
174  image.QvecPrior(0));
175  BOOST_CHECK_EQUAL(database.ReadImage(image.ImageId()).QvecPrior(1),
176  image.QvecPrior(1));
177  BOOST_CHECK_EQUAL(database.ReadImage(image.ImageId()).QvecPrior(2),
178  image.QvecPrior(2));
179  BOOST_CHECK_EQUAL(database.ReadImage(image.ImageId()).QvecPrior(3),
180  image.QvecPrior(3));
181  BOOST_CHECK_EQUAL(database.ReadImage(image.ImageId()).TvecPrior(0),
182  image.TvecPrior(0));
183  BOOST_CHECK_EQUAL(database.ReadImage(image.ImageId()).TvecPrior(1),
184  image.TvecPrior(1));
185  BOOST_CHECK_EQUAL(database.ReadImage(image.ImageId()).TvecPrior(2),
186  image.TvecPrior(2));
187  image.TvecPrior(0) += 2;
188  database.UpdateImage(image);
189  BOOST_CHECK_EQUAL(database.ReadImage(image.ImageId()).ImageId(),
190  image.ImageId());
191  BOOST_CHECK_EQUAL(database.ReadImage(image.ImageId()).CameraId(),
192  image.CameraId());
193  BOOST_CHECK_EQUAL(database.ReadImage(image.ImageId()).QvecPrior(0),
194  image.QvecPrior(0));
195  BOOST_CHECK_EQUAL(database.ReadImage(image.ImageId()).QvecPrior(1),
196  image.QvecPrior(1));
197  BOOST_CHECK_EQUAL(database.ReadImage(image.ImageId()).QvecPrior(2),
198  image.QvecPrior(2));
199  BOOST_CHECK_EQUAL(database.ReadImage(image.ImageId()).QvecPrior(3),
200  image.QvecPrior(3));
201  BOOST_CHECK_EQUAL(database.ReadImage(image.ImageId()).TvecPrior(0),
202  image.TvecPrior(0));
203  BOOST_CHECK_EQUAL(database.ReadImage(image.ImageId()).TvecPrior(1),
204  image.TvecPrior(1));
205  BOOST_CHECK_EQUAL(database.ReadImage(image.ImageId()).TvecPrior(2),
206  image.TvecPrior(2));
207  Image image2 = image;
208  image2.SetName("test2");
209  image2.SetImageId(image.ImageId() + 1);
210  database.WriteImage(image2, true);
211  BOOST_CHECK_EQUAL(database.NumImages(), 2);
212  BOOST_CHECK_EQUAL(database.ExistsImage(image.ImageId()), true);
213  BOOST_CHECK_EQUAL(database.ExistsImage(image2.ImageId()), true);
214  BOOST_CHECK_EQUAL(database.ReadAllImages().size(), 2);
215  database.ClearImages();
216  BOOST_CHECK_EQUAL(database.NumImages(), 0);
217 }
218 
219 BOOST_AUTO_TEST_CASE(TestKeypoints) {
220  Database database(kMemoryDatabasePath);
221  Camera camera;
222  camera.SetCameraId(database.WriteCamera(camera));
223  Image image;
224  image.SetName("test");
225  image.SetCameraId(camera.CameraId());
226  image.SetImageId(database.WriteImage(image));
227  BOOST_CHECK_EQUAL(database.NumKeypoints(), 0);
228  BOOST_CHECK_EQUAL(database.NumKeypointsForImage(image.ImageId()), 0);
229  const FeatureKeypoints keypoints = FeatureKeypoints(10);
230  database.WriteKeypoints(image.ImageId(), keypoints);
231  const FeatureKeypoints keypoints_read =
232  database.ReadKeypoints(image.ImageId());
233  BOOST_CHECK_EQUAL(keypoints.size(), keypoints_read.size());
234  for (size_t i = 0; i < keypoints.size(); ++i) {
235  BOOST_CHECK_EQUAL(keypoints[i].x, keypoints_read[i].x);
236  BOOST_CHECK_EQUAL(keypoints[i].y, keypoints_read[i].y);
237  BOOST_CHECK_EQUAL(keypoints[i].a11, keypoints_read[i].a11);
238  BOOST_CHECK_EQUAL(keypoints[i].a12, keypoints_read[i].a12);
239  BOOST_CHECK_EQUAL(keypoints[i].a21, keypoints_read[i].a21);
240  BOOST_CHECK_EQUAL(keypoints[i].a22, keypoints_read[i].a22);
241  }
242  BOOST_CHECK_EQUAL(database.NumKeypoints(), 10);
243  BOOST_CHECK_EQUAL(database.MaxNumKeypoints(), 10);
244  BOOST_CHECK_EQUAL(database.NumKeypointsForImage(image.ImageId()), 10);
245  const FeatureKeypoints keypoints2 = FeatureKeypoints(20);
246  image.SetName("test2");
247  image.SetImageId(database.WriteImage(image));
248  database.WriteKeypoints(image.ImageId(), keypoints2);
249  BOOST_CHECK_EQUAL(database.NumKeypoints(), 30);
250  BOOST_CHECK_EQUAL(database.MaxNumKeypoints(), 20);
251  BOOST_CHECK_EQUAL(database.NumKeypointsForImage(image.ImageId()), 20);
252  database.ClearKeypoints();
253  BOOST_CHECK_EQUAL(database.NumKeypoints(), 0);
254  BOOST_CHECK_EQUAL(database.MaxNumKeypoints(), 0);
255  BOOST_CHECK_EQUAL(database.NumKeypointsForImage(image.ImageId()), 0);
256 }
257 
258 BOOST_AUTO_TEST_CASE(TestDescriptors) {
259  Database database(kMemoryDatabasePath);
260  Camera camera;
261  camera.SetCameraId(database.WriteCamera(camera));
262  Image image;
263  image.SetName("test");
264  image.SetCameraId(camera.CameraId());
265  image.SetImageId(database.WriteImage(image));
266  BOOST_CHECK_EQUAL(database.NumDescriptors(), 0);
267  BOOST_CHECK_EQUAL(database.NumDescriptorsForImage(image.ImageId()), 0);
268  const FeatureDescriptors descriptors = FeatureDescriptors::Random(10, 128);
269  database.WriteDescriptors(image.ImageId(), descriptors);
270  const FeatureDescriptors descriptors_read =
271  database.ReadDescriptors(image.ImageId());
272  BOOST_CHECK_EQUAL(descriptors.rows(), descriptors_read.rows());
273  BOOST_CHECK_EQUAL(descriptors.cols(), descriptors_read.cols());
274  for (FeatureDescriptors::Index r = 0; r < descriptors.rows(); ++r) {
275  for (FeatureDescriptors::Index c = 0; c < descriptors.cols(); ++c) {
276  BOOST_CHECK_EQUAL(descriptors(r, c), descriptors_read(r, c));
277  }
278  }
279  BOOST_CHECK_EQUAL(database.NumDescriptors(), 10);
280  BOOST_CHECK_EQUAL(database.MaxNumDescriptors(), 10);
281  BOOST_CHECK_EQUAL(database.NumDescriptorsForImage(image.ImageId()), 10);
282  const FeatureDescriptors descriptors2 = FeatureDescriptors(20, 128);
283  image.SetName("test2");
284  image.SetImageId(database.WriteImage(image));
285  database.WriteDescriptors(image.ImageId(), descriptors2);
286  BOOST_CHECK_EQUAL(database.NumDescriptors(), 30);
287  BOOST_CHECK_EQUAL(database.MaxNumDescriptors(), 20);
288  BOOST_CHECK_EQUAL(database.NumDescriptorsForImage(image.ImageId()), 20);
289  database.ClearDescriptors();
290  BOOST_CHECK_EQUAL(database.NumDescriptors(), 0);
291  BOOST_CHECK_EQUAL(database.MaxNumDescriptors(), 0);
292  BOOST_CHECK_EQUAL(database.NumDescriptorsForImage(image.ImageId()), 0);
293 }
294 
295 BOOST_AUTO_TEST_CASE(TestMatches) {
296  Database database(kMemoryDatabasePath);
297  const image_t image_id1 = 1;
298  const image_t image_id2 = 2;
299  const FeatureMatches matches = FeatureMatches(1000);
300  database.WriteMatches(image_id1, image_id2, matches);
301  const FeatureMatches matches_read =
302  database.ReadMatches(image_id1, image_id2);
303  BOOST_CHECK_EQUAL(matches.size(), matches_read.size());
304  for (size_t i = 0; i < matches.size(); ++i) {
305  BOOST_CHECK_EQUAL(matches[i].point2D_idx1, matches_read[i].point2D_idx1);
306  BOOST_CHECK_EQUAL(matches[i].point2D_idx2, matches_read[i].point2D_idx2);
307  }
308  BOOST_CHECK_EQUAL(database.ReadAllMatches().size(), 1);
309  BOOST_CHECK_EQUAL(database.ReadAllMatches()[0].first,
310  Database::ImagePairToPairId(image_id1, image_id2));
311  BOOST_CHECK_EQUAL(database.NumMatches(), 1000);
312  database.DeleteMatches(image_id1, image_id2);
313  BOOST_CHECK_EQUAL(database.NumMatches(), 0);
314  database.WriteMatches(image_id1, image_id2, matches);
315  BOOST_CHECK_EQUAL(database.NumMatches(), 1000);
316  database.ClearMatches();
317  BOOST_CHECK_EQUAL(database.NumMatches(), 0);
318 }
319 
320 BOOST_AUTO_TEST_CASE(TestTwoViewGeometry) {
321  Database database(kMemoryDatabasePath);
322  const image_t image_id1 = 1;
323  const image_t image_id2 = 2;
324  TwoViewGeometry two_view_geometry;
325  two_view_geometry.inlier_matches = FeatureMatches(1000);
326  two_view_geometry.config =
327  TwoViewGeometry::ConfigurationType::PLANAR_OR_PANORAMIC;
328  two_view_geometry.F = Eigen::Matrix3d::Random();
329  two_view_geometry.E = Eigen::Matrix3d::Random();
330  two_view_geometry.H = Eigen::Matrix3d::Random();
331  two_view_geometry.qvec = Eigen::Vector4d::Random();
332  two_view_geometry.tvec = Eigen::Vector3d::Random();
333  database.WriteTwoViewGeometry(image_id1, image_id2, two_view_geometry);
334  const TwoViewGeometry two_view_geometry_read =
335  database.ReadTwoViewGeometry(image_id1, image_id2);
336  BOOST_CHECK_EQUAL(two_view_geometry.inlier_matches.size(),
337  two_view_geometry_read.inlier_matches.size());
338  for (size_t i = 0; i < two_view_geometry_read.inlier_matches.size(); ++i) {
339  BOOST_CHECK_EQUAL(two_view_geometry.inlier_matches[i].point2D_idx1,
340  two_view_geometry_read.inlier_matches[i].point2D_idx1);
341  BOOST_CHECK_EQUAL(two_view_geometry.inlier_matches[i].point2D_idx2,
342  two_view_geometry_read.inlier_matches[i].point2D_idx2);
343  }
344 
345  BOOST_CHECK_EQUAL(two_view_geometry.config, two_view_geometry_read.config);
346  BOOST_CHECK_EQUAL(two_view_geometry.F, two_view_geometry_read.F);
347  BOOST_CHECK_EQUAL(two_view_geometry.E, two_view_geometry_read.E);
348  BOOST_CHECK_EQUAL(two_view_geometry.H, two_view_geometry_read.H);
349  BOOST_CHECK_EQUAL(two_view_geometry.qvec, two_view_geometry_read.qvec);
350  BOOST_CHECK_EQUAL(two_view_geometry.tvec, two_view_geometry_read.tvec);
351 
352  const TwoViewGeometry two_view_geometry_read_inv =
353  database.ReadTwoViewGeometry(image_id2, image_id1);
354  BOOST_CHECK_EQUAL(two_view_geometry_read_inv.inlier_matches.size(),
355  two_view_geometry_read.inlier_matches.size());
356  for (size_t i = 0; i < two_view_geometry_read.inlier_matches.size(); ++i) {
357  BOOST_CHECK_EQUAL(two_view_geometry_read_inv.inlier_matches[i].point2D_idx2,
358  two_view_geometry_read.inlier_matches[i].point2D_idx1);
359  BOOST_CHECK_EQUAL(two_view_geometry_read_inv.inlier_matches[i].point2D_idx1,
360  two_view_geometry_read.inlier_matches[i].point2D_idx2);
361  }
362 
363  BOOST_CHECK_EQUAL(two_view_geometry_read_inv.config,
364  two_view_geometry_read.config);
365  BOOST_CHECK_EQUAL(two_view_geometry_read_inv.F.transpose(),
366  two_view_geometry_read.F);
367  BOOST_CHECK_EQUAL(two_view_geometry_read_inv.E.transpose(),
368  two_view_geometry_read.E);
369  BOOST_CHECK(two_view_geometry_read_inv.H.inverse().eval().isApprox(
370  two_view_geometry_read.H));
371 
372  Eigen::Vector4d read_inv_qvec_inv;
373  Eigen::Vector3d read_inv_tvec_inv;
374  InvertPose(two_view_geometry_read_inv.qvec, two_view_geometry_read_inv.tvec,
375  &read_inv_qvec_inv, &read_inv_tvec_inv);
376  BOOST_CHECK_EQUAL(read_inv_qvec_inv, two_view_geometry_read.qvec);
377  BOOST_CHECK(read_inv_tvec_inv.isApprox(two_view_geometry_read.tvec));
378 
379  std::vector<image_pair_t> image_pair_ids;
380  std::vector<TwoViewGeometry> two_view_geometries;
381  database.ReadTwoViewGeometries(&image_pair_ids, &two_view_geometries);
382  BOOST_CHECK_EQUAL(image_pair_ids.size(), 1);
383  BOOST_CHECK_EQUAL(two_view_geometries.size(), 1);
384  BOOST_CHECK_EQUAL(image_pair_ids[0],
385  Database::ImagePairToPairId(image_id1, image_id2));
386  BOOST_CHECK_EQUAL(two_view_geometry.config, two_view_geometries[0].config);
387  BOOST_CHECK_EQUAL(two_view_geometry.F, two_view_geometries[0].F);
388  BOOST_CHECK_EQUAL(two_view_geometry.E, two_view_geometries[0].E);
389  BOOST_CHECK_EQUAL(two_view_geometry.H, two_view_geometries[0].H);
390  BOOST_CHECK_EQUAL(two_view_geometry.qvec, two_view_geometries[0].qvec);
391  BOOST_CHECK_EQUAL(two_view_geometry.tvec, two_view_geometries[0].tvec);
392  BOOST_CHECK_EQUAL(two_view_geometry.inlier_matches.size(),
393  two_view_geometries[0].inlier_matches.size());
394  std::vector<std::pair<image_t, image_t>> image_pairs;
395  std::vector<int> num_inliers;
396  database.ReadTwoViewGeometryNumInliers(&image_pairs, &num_inliers);
397  BOOST_CHECK_EQUAL(image_pairs.size(), 1);
398  BOOST_CHECK_EQUAL(num_inliers.size(), 1);
399  BOOST_CHECK_EQUAL(image_pairs[0].first, image_id1);
400  BOOST_CHECK_EQUAL(image_pairs[0].second, image_id2);
401  BOOST_CHECK_EQUAL(num_inliers[0], two_view_geometry.inlier_matches.size());
402  BOOST_CHECK_EQUAL(database.NumInlierMatches(), 1000);
403  database.DeleteInlierMatches(image_id1, image_id2);
404  BOOST_CHECK_EQUAL(database.NumInlierMatches(), 0);
405  database.WriteTwoViewGeometry(image_id1, image_id2, two_view_geometry);
406  BOOST_CHECK_EQUAL(database.NumInlierMatches(), 1000);
407  database.ClearTwoViewGeometries();
408  BOOST_CHECK_EQUAL(database.NumInlierMatches(), 0);
409 }
410 
412  Database database1(kMemoryDatabasePath);
413  Database database2(kMemoryDatabasePath);
414 
415  Camera camera;
416  camera.InitializeWithName("SIMPLE_PINHOLE", 1.0, 1, 1);
417  camera.SetCameraId(database1.WriteCamera(camera));
418  camera.SetCameraId(database2.WriteCamera(camera));
419 
420  Image image;
421  image.SetCameraId(camera.CameraId());
422  image.SetQvecPrior(Eigen::Vector4d(0.1, 0.2, 0.3, 0.4));
423  image.SetTvecPrior(Eigen::Vector3d(0.1, 0.2, 0.3));
424 
425  image.SetName("test1");
426  const image_t image_id1 = database1.WriteImage(image);
427  image.SetName("test2");
428  const image_t image_id2 = database1.WriteImage(image);
429  image.SetName("test3");
430  const image_t image_id3 = database2.WriteImage(image);
431  image.SetName("test4");
432  const image_t image_id4 = database2.WriteImage(image);
433 
434  auto keypoints1 = FeatureKeypoints(10);
435  keypoints1[0].x = 100;
436  auto keypoints2 = FeatureKeypoints(20);
437  keypoints2[0].x = 200;
438  auto keypoints3 = FeatureKeypoints(30);
439  keypoints3[0].x = 300;
440  auto keypoints4 = FeatureKeypoints(40);
441  keypoints4[0].x = 400;
442 
443  const auto descriptors1 = FeatureDescriptors::Random(10, 128);
444  const auto descriptors2 = FeatureDescriptors::Random(20, 128);
445  const auto descriptors3 = FeatureDescriptors::Random(30, 128);
446  const auto descriptors4 = FeatureDescriptors::Random(40, 128);
447 
448  database1.WriteKeypoints(image_id1, keypoints1);
449  database1.WriteKeypoints(image_id2, keypoints2);
450  database2.WriteKeypoints(image_id3, keypoints3);
451  database2.WriteKeypoints(image_id4, keypoints4);
452  database1.WriteDescriptors(image_id1, descriptors1);
453  database1.WriteDescriptors(image_id2, descriptors2);
454  database2.WriteDescriptors(image_id3, descriptors3);
455  database2.WriteDescriptors(image_id4, descriptors4);
456  database1.WriteMatches(image_id1, image_id2, FeatureMatches(10));
457  database2.WriteMatches(image_id3, image_id4, FeatureMatches(10));
458  database1.WriteTwoViewGeometry(image_id1, image_id2, TwoViewGeometry());
459  database2.WriteTwoViewGeometry(image_id3, image_id4, TwoViewGeometry());
460 
461  Database merged_database(kMemoryDatabasePath);
462  Database::Merge(database1, database2, &merged_database);
463  BOOST_CHECK_EQUAL(merged_database.NumCameras(), 2);
464  BOOST_CHECK_EQUAL(merged_database.NumImages(), 4);
465  BOOST_CHECK_EQUAL(merged_database.NumKeypoints(), 100);
466  BOOST_CHECK_EQUAL(merged_database.NumDescriptors(), 100);
467  BOOST_CHECK_EQUAL(merged_database.NumMatches(), 20);
468  BOOST_CHECK_EQUAL(merged_database.NumInlierMatches(), 0);
469  BOOST_CHECK_EQUAL(merged_database.ReadAllImages()[0].CameraId(), 1);
470  BOOST_CHECK_EQUAL(merged_database.ReadAllImages()[1].CameraId(), 1);
471  BOOST_CHECK_EQUAL(merged_database.ReadAllImages()[2].CameraId(), 2);
472  BOOST_CHECK_EQUAL(merged_database.ReadAllImages()[3].CameraId(), 2);
473  BOOST_CHECK_EQUAL(merged_database.ReadKeypoints(1).size(), 10);
474  BOOST_CHECK_EQUAL(merged_database.ReadKeypoints(2).size(), 20);
475  BOOST_CHECK_EQUAL(merged_database.ReadKeypoints(3).size(), 30);
476  BOOST_CHECK_EQUAL(merged_database.ReadKeypoints(4).size(), 40);
477  BOOST_CHECK_EQUAL(merged_database.ReadKeypoints(1)[0].x, 100);
478  BOOST_CHECK_EQUAL(merged_database.ReadKeypoints(2)[0].x, 200);
479  BOOST_CHECK_EQUAL(merged_database.ReadKeypoints(3)[0].x, 300);
480  BOOST_CHECK_EQUAL(merged_database.ReadKeypoints(4)[0].x, 400);
481  BOOST_CHECK_EQUAL(merged_database.ReadDescriptors(1).size(),
482  descriptors1.size());
483  BOOST_CHECK_EQUAL(merged_database.ReadDescriptors(2).size(),
484  descriptors2.size());
485  BOOST_CHECK_EQUAL(merged_database.ReadDescriptors(3).size(),
486  descriptors3.size());
487  BOOST_CHECK_EQUAL(merged_database.ReadDescriptors(4).size(),
488  descriptors4.size());
489  BOOST_CHECK(merged_database.ExistsMatches(1, 2));
490  BOOST_CHECK(!merged_database.ExistsMatches(2, 3));
491  BOOST_CHECK(!merged_database.ExistsMatches(2, 4));
492  BOOST_CHECK(merged_database.ExistsMatches(3, 4));
493  merged_database.ClearAllTables();
494  BOOST_CHECK_EQUAL(merged_database.NumCameras(), 0);
495  BOOST_CHECK_EQUAL(merged_database.NumImages(), 0);
496  BOOST_CHECK_EQUAL(merged_database.NumKeypoints(), 0);
497  BOOST_CHECK_EQUAL(merged_database.NumDescriptors(), 0);
498  BOOST_CHECK_EQUAL(merged_database.NumMatches(), 0);
499 }
std::shared_ptr< core::Tensor > image
void InitializeWithName(const std::string &model_name, const double focal_length, const size_t width, const size_t height)
Definition: camera.cc:212
camera_t CameraId() const
Definition: camera.h:154
int ModelId() const
Definition: camera.h:158
void SetFocalLength(const double focal_length)
Definition: camera.cc:127
double FocalLength() const
Definition: camera.cc:109
void SetCameraId(const camera_t camera_id)
Definition: camera.h:156
double PrincipalPointX() const
Definition: camera.cc:146
double PrincipalPointY() const
Definition: camera.cc:152
void ClearCameras() const
Definition: database.cc:836
void WriteDescriptors(const image_t image_id, const FeatureDescriptors &descriptors) const
Definition: database.cc:676
size_t NumMatches() const
Definition: database.cc:353
static const size_t kMaxNumImages
Definition: database.h:37
FeatureDescriptors ReadDescriptors(const image_t image_id) const
Definition: database.cc:448
void ClearDescriptors() const
Definition: database.cc:846
static void Merge(const Database &database1, const Database &database2, Database *merged_database)
Definition: database.cc:866
size_t NumMatchedImagePairs() const
Definition: database.cc:359
void ReadTwoViewGeometryNumInliers(std::vector< std::pair< image_t, image_t >> *image_pairs, std::vector< int > *num_inliers) const
Definition: database.cc:579
void ClearImages() const
Definition: database.cc:841
size_t MaxNumDescriptors() const
Definition: database.cc:345
void ClearAllTables() const
Definition: database.cc:827
FeatureMatches ReadMatches(const image_t image_id1, const image_t image_id2) const
Definition: database.cc:461
bool ExistsImage(const image_t image_id) const
Definition: database.cc:299
void DeleteInlierMatches(const image_t image_id1, const image_t image_id2) const
Definition: database.cc:818
size_t NumImages() const
Definition: database.cc:329
void WriteMatches(const image_t image_id1, const image_t image_id2, const FeatureMatches &matches) const
Definition: database.cc:685
bool ExistsMatches(const image_t image_id1, const image_t image_id2) const
Definition: database.cc:315
FeatureKeypoints ReadKeypoints(const image_t image_id) const
Definition: database.cc:436
size_t NumInlierMatches() const
Definition: database.cc:355
void ClearKeypoints() const
Definition: database.cc:851
size_t NumDescriptors() const
Definition: database.cc:341
size_t NumKeypoints() const
Definition: database.cc:331
void WriteTwoViewGeometry(const image_t image_id1, const image_t image_id2, const TwoViewGeometry &two_view_geometry) const
Definition: database.cc:703
size_t NumVerifiedImagePairs() const
Definition: database.cc:361
void WriteKeypoints(const image_t image_id, const FeatureKeypoints &keypoints) const
Definition: database.cc:665
std::vector< std::pair< image_pair_t, FeatureMatches > > ReadAllMatches() const
Definition: database.cc:479
static image_pair_t ImagePairToPairId(const image_t image_id1, const image_t image_id2)
Definition: database.h:339
size_t NumKeypointsForImage(const image_t image_id) const
Definition: database.cc:337
std::vector< Camera > ReadAllCameras() const
Definition: database.cc:380
bool ExistsCamera(const camera_t camera_id) const
Definition: database.cc:295
void DeleteMatches(const image_t image_id1, const image_t image_id2) const
Definition: database.cc:809
size_t NumDescriptorsForImage(const image_t image_id) const
Definition: database.cc:349
void ReadTwoViewGeometries(std::vector< image_pair_t > *image_pair_ids, std::vector< TwoViewGeometry > *two_view_geometries) const
Definition: database.cc:539
void ClearTwoViewGeometries() const
Definition: database.cc:861
static bool SwapImagePair(const image_t image_id1, const image_t image_id2)
Definition: database.h:366
void ClearMatches() const
Definition: database.cc:856
void UpdateCamera(const Camera &camera) const
Definition: database.cc:760
size_t MaxNumKeypoints() const
Definition: database.cc:333
TwoViewGeometry ReadTwoViewGeometry(const image_t image_id1, const image_t image_id2) const
Definition: database.cc:498
static void PairIdToImagePair(const image_pair_t pair_id, image_t *image_id1, image_t *image_id2)
Definition: database.h:352
Camera ReadCamera(const camera_t camera_id) const
Definition: database.cc:365
void UpdateImage(const Image &image) const
Definition: database.cc:783
image_t WriteImage(const Image &image, const bool use_image_id=false) const
Definition: database.cc:633
size_t NumCameras() const
Definition: database.cc:327
std::vector< Image > ReadAllImages() const
Definition: database.cc:423
camera_t WriteCamera(const Camera &camera, const bool use_camera_id=false) const
Definition: database.cc:603
Image ReadImage(const image_t image_id) const
Definition: database.cc:392
image_t ImageId() const
Definition: image.h:238
void SetName(const std::string &name)
Definition: image.h:246
const Eigen::Vector3d & TvecPrior() const
Definition: image.h:335
const Eigen::Vector4d & QvecPrior() const
Definition: image.h:311
void SetImageId(const image_t image_id)
Definition: image.h:240
camera_t CameraId() const
Definition: image.h:248
static const std::string kMemoryDatabasePath
BOOST_AUTO_TEST_CASE(TestOpenCloseConstructorDestructor)
normal_z y
normal_z x
uint64_t image_pair_t
Definition: types.h:64
void InvertPose(const Eigen::Vector4d &qvec, const Eigen::Vector3d &tvec, Eigen::Vector4d *inv_qvec, Eigen::Vector3d *inv_tvec)
Definition: pose.cc:192
Eigen::Matrix< uint8_t, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > FeatureDescriptors
Definition: types.h:79
uint32_t image_t
Definition: types.h:61
std::vector< FeatureKeypoint > FeatureKeypoints
Definition: types.h:77
std::vector< FeatureMatch > FeatureMatches
Definition: types.h:80
Eigen::MatrixXd::Index Index
Definition: knncpp.h:26
CorePointDescSet * descriptors