ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
database.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 #include "base/database.h"
33 
34 #include <fstream>
35 
36 #include "util/sqlite3_utils.h"
37 #include "util/string.h"
38 #include "util/version.h"
39 
40 namespace colmap {
41 namespace {
42 
43 typedef Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>
44  FeatureKeypointsBlob;
45 typedef Eigen::Matrix<uint8_t, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>
46  FeatureDescriptorsBlob;
47 typedef Eigen::Matrix<point2D_t, Eigen::Dynamic, 2, Eigen::RowMajor>
48  FeatureMatchesBlob;
49 
50 void SwapFeatureMatchesBlob(FeatureMatchesBlob* matches) {
51  matches->col(0).swap(matches->col(1));
52 }
53 
54 FeatureKeypointsBlob FeatureKeypointsToBlob(const FeatureKeypoints& keypoints) {
55  const FeatureKeypointsBlob::Index kNumCols = 6;
56  FeatureKeypointsBlob blob(keypoints.size(), kNumCols);
57  for (size_t i = 0; i < keypoints.size(); ++i) {
58  blob(i, 0) = keypoints[i].x;
59  blob(i, 1) = keypoints[i].y;
60  blob(i, 2) = keypoints[i].a11;
61  blob(i, 3) = keypoints[i].a12;
62  blob(i, 4) = keypoints[i].a21;
63  blob(i, 5) = keypoints[i].a22;
64  }
65  return blob;
66 }
67 
68 FeatureKeypoints FeatureKeypointsFromBlob(const FeatureKeypointsBlob& blob) {
69  FeatureKeypoints keypoints(static_cast<size_t>(blob.rows()));
70  if (blob.cols() == 2) {
71  for (FeatureKeypointsBlob::Index i = 0; i < blob.rows(); ++i) {
72  keypoints[i] = FeatureKeypoint(blob(i, 0), blob(i, 1));
73  }
74  } else if (blob.cols() == 4) {
75  for (FeatureKeypointsBlob::Index i = 0; i < blob.rows(); ++i) {
76  keypoints[i] =
77  FeatureKeypoint(blob(i, 0), blob(i, 1), blob(i, 2), blob(i, 3));
78  }
79  } else if (blob.cols() == 6) {
80  for (FeatureKeypointsBlob::Index i = 0; i < blob.rows(); ++i) {
81  keypoints[i] = FeatureKeypoint(blob(i, 0), blob(i, 1), blob(i, 2),
82  blob(i, 3), blob(i, 4), blob(i, 5));
83  }
84  } else {
85  LOG(FATAL) << "Keypoint format not supported";
86  }
87  return keypoints;
88 }
89 
90 FeatureMatchesBlob FeatureMatchesToBlob(const FeatureMatches& matches) {
91  const FeatureMatchesBlob::Index kNumCols = 2;
92  FeatureMatchesBlob blob(matches.size(), kNumCols);
93  for (size_t i = 0; i < matches.size(); ++i) {
94  blob(i, 0) = matches[i].point2D_idx1;
95  blob(i, 1) = matches[i].point2D_idx2;
96  }
97  return blob;
98 }
99 
100 FeatureMatches FeatureMatchesFromBlob(const FeatureMatchesBlob& blob) {
101  CHECK_EQ(blob.cols(), 2);
102  FeatureMatches matches(static_cast<size_t>(blob.rows()));
103  for (FeatureMatchesBlob::Index i = 0; i < blob.rows(); ++i) {
104  matches[i].point2D_idx1 = blob(i, 0);
105  matches[i].point2D_idx2 = blob(i, 1);
106  }
107  return matches;
108 }
109 
110 template <typename MatrixType>
111 MatrixType ReadStaticMatrixBlob(sqlite3_stmt* sql_stmt, const int rc,
112  const int col) {
113  CHECK_GE(col, 0);
114 
115  MatrixType matrix;
116 
117  if (rc == SQLITE_ROW) {
118  const size_t num_bytes =
119  static_cast<size_t>(sqlite3_column_bytes(sql_stmt, col));
120  if (num_bytes > 0) {
121  CHECK_EQ(num_bytes, matrix.size() * sizeof(typename MatrixType::Scalar));
122  memcpy(reinterpret_cast<char*>(matrix.data()),
123  sqlite3_column_blob(sql_stmt, col), num_bytes);
124  } else {
125  matrix = MatrixType::Zero();
126  }
127  } else {
128  matrix = MatrixType::Zero();
129  }
130 
131  return matrix;
132 }
133 
134 template <typename MatrixType>
135 MatrixType ReadDynamicMatrixBlob(sqlite3_stmt* sql_stmt, const int rc,
136  const int col) {
137  CHECK_GE(col, 0);
138 
139  MatrixType matrix;
140 
141  if (rc == SQLITE_ROW) {
142  const size_t rows =
143  static_cast<size_t>(sqlite3_column_int64(sql_stmt, col + 0));
144  const size_t cols =
145  static_cast<size_t>(sqlite3_column_int64(sql_stmt, col + 1));
146 
147  CHECK_GE(rows, 0);
148  CHECK_GE(cols, 0);
149  matrix = MatrixType(rows, cols);
150 
151  const size_t num_bytes =
152  static_cast<size_t>(sqlite3_column_bytes(sql_stmt, col + 2));
153  CHECK_EQ(matrix.size() * sizeof(typename MatrixType::Scalar), num_bytes);
154 
155  memcpy(reinterpret_cast<char*>(matrix.data()),
156  sqlite3_column_blob(sql_stmt, col + 2), num_bytes);
157  } else {
158  const typename MatrixType::Index rows =
159  (MatrixType::RowsAtCompileTime == Eigen::Dynamic)
160  ? 0
161  : MatrixType::RowsAtCompileTime;
162  const typename MatrixType::Index cols =
163  (MatrixType::ColsAtCompileTime == Eigen::Dynamic)
164  ? 0
165  : MatrixType::ColsAtCompileTime;
166  matrix = MatrixType(rows, cols);
167  }
168 
169  return matrix;
170 }
171 
172 template <typename MatrixType>
173 void WriteStaticMatrixBlob(sqlite3_stmt* sql_stmt, const MatrixType& matrix,
174  const int col) {
175  SQLITE3_CALL(sqlite3_bind_blob(
176  sql_stmt, col, reinterpret_cast<const char*>(matrix.data()),
177  static_cast<int>(matrix.size() * sizeof(typename MatrixType::Scalar)),
178  SQLITE_STATIC));
179 }
180 
181 template <typename MatrixType>
182 void WriteDynamicMatrixBlob(sqlite3_stmt* sql_stmt, const MatrixType& matrix,
183  const int col) {
184  CHECK_GE(matrix.rows(), 0);
185  CHECK_GE(matrix.cols(), 0);
186  CHECK_GE(col, 0);
187 
188  const size_t num_bytes = matrix.size() * sizeof(typename MatrixType::Scalar);
189  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt, col + 0, matrix.rows()));
190  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt, col + 1, matrix.cols()));
191  SQLITE3_CALL(sqlite3_bind_blob(sql_stmt, col + 2,
192  reinterpret_cast<const char*>(matrix.data()),
193  static_cast<int>(num_bytes), SQLITE_STATIC));
194 }
195 
196 Camera ReadCameraRow(sqlite3_stmt* sql_stmt) {
197  Camera camera;
198 
199  camera.SetCameraId(static_cast<camera_t>(sqlite3_column_int64(sql_stmt, 0)));
200  camera.SetModelId(sqlite3_column_int64(sql_stmt, 1));
201  camera.SetWidth(static_cast<size_t>(sqlite3_column_int64(sql_stmt, 2)));
202  camera.SetHeight(static_cast<size_t>(sqlite3_column_int64(sql_stmt, 3)));
203 
204  const size_t num_params_bytes =
205  static_cast<size_t>(sqlite3_column_bytes(sql_stmt, 4));
206  const size_t num_params = num_params_bytes / sizeof(double);
207  CHECK_EQ(num_params, camera.NumParams());
208  memcpy(camera.ParamsData(), sqlite3_column_blob(sql_stmt, 4),
209  num_params_bytes);
210 
211  camera.SetPriorFocalLength(sqlite3_column_int64(sql_stmt, 5) != 0);
212 
213  return camera;
214 }
215 
216 Image ReadImageRow(sqlite3_stmt* sql_stmt) {
217  Image image;
218 
219  image.SetImageId(static_cast<image_t>(sqlite3_column_int64(sql_stmt, 0)));
220  image.SetName(std::string(
221  reinterpret_cast<const char*>(sqlite3_column_text(sql_stmt, 1))));
222  image.SetCameraId(static_cast<camera_t>(sqlite3_column_int64(sql_stmt, 2)));
223 
224  // NaNs are automatically converted to NULLs in SQLite.
225  for (size_t i = 0; i < 4; ++i) {
226  if (sqlite3_column_type(sql_stmt, i + 3) != SQLITE_NULL) {
227  image.QvecPrior(i) = sqlite3_column_double(sql_stmt, i + 3);
228  }
229  }
230 
231  // NaNs are automatically converted to NULLs in SQLite.
232  for (size_t i = 0; i < 3; ++i) {
233  if (sqlite3_column_type(sql_stmt, i + 7) != SQLITE_NULL) {
234  image.TvecPrior(i) = sqlite3_column_double(sql_stmt, i + 7);
235  }
236  }
237 
238  return image;
239 }
240 
241 } // namespace
242 
243 const size_t Database::kMaxNumImages =
244  static_cast<size_t>(std::numeric_limits<int32_t>::max());
245 
246 std::mutex Database::update_schema_mutex_;
247 
248 Database::Database() : database_(nullptr) {}
249 
250 Database::Database(const std::string& path) : Database() { Open(path); }
251 
253 
254 void Database::Open(const std::string& path) {
255  Close();
256 
257  // SQLITE_OPEN_NOMUTEX specifies that the connection should not have a
258  // mutex (so that we don't serialize the connection's operations).
259  // Modifications to the database will still be serialized, but multiple
260  // connections can read concurrently.
261  SQLITE3_CALL(sqlite3_open_v2(
262  path.c_str(), &database_,
263  SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_NOMUTEX,
264  nullptr));
265 
266  // Don't wait for the operating system to write the changes to disk
267  SQLITE3_EXEC(database_, "PRAGMA synchronous=OFF", nullptr);
268 
269  // Use faster journaling mode
270  SQLITE3_EXEC(database_, "PRAGMA journal_mode=WAL", nullptr);
271 
272  // Store temporary tables and indices in memory
273  SQLITE3_EXEC(database_, "PRAGMA temp_store=MEMORY", nullptr);
274 
275  // Disabled by default
276  SQLITE3_EXEC(database_, "PRAGMA foreign_keys=ON", nullptr);
277 
278  // Enable auto vacuum to reduce DB file size
279  SQLITE3_EXEC(database_, "PRAGMA auto_vacuum=1", nullptr);
280 
281  CreateTables();
282  UpdateSchema();
283  PrepareSQLStatements();
284 }
285 
287  if (database_ != nullptr) {
288  FinalizeSQLStatements();
289  SQLITE3_EXEC(database_, "VACUUM", nullptr);
290  sqlite3_close_v2(database_);
291  database_ = nullptr;
292  }
293 }
294 
295 bool Database::ExistsCamera(const camera_t camera_id) const {
296  return ExistsRowId(sql_stmt_exists_camera_, camera_id);
297 }
298 
299 bool Database::ExistsImage(const image_t image_id) const {
300  return ExistsRowId(sql_stmt_exists_image_id_, image_id);
301 }
302 
303 bool Database::ExistsImageWithName(std::string name) const {
304  return ExistsRowString(sql_stmt_exists_image_name_, name);
305 }
306 
307 bool Database::ExistsKeypoints(const image_t image_id) const {
308  return ExistsRowId(sql_stmt_exists_keypoints_, image_id);
309 }
310 
311 bool Database::ExistsDescriptors(const image_t image_id) const {
312  return ExistsRowId(sql_stmt_exists_descriptors_, image_id);
313 }
314 
315 bool Database::ExistsMatches(const image_t image_id1,
316  const image_t image_id2) const {
317  return ExistsRowId(sql_stmt_exists_matches_,
318  ImagePairToPairId(image_id1, image_id2));
319 }
320 
322  const image_t image_id2) const {
323  return ExistsRowId(sql_stmt_exists_two_view_geometry_,
324  ImagePairToPairId(image_id1, image_id2));
325 }
326 
327 size_t Database::NumCameras() const { return CountRows("cameras"); }
328 
329 size_t Database::NumImages() const { return CountRows("images"); }
330 
331 size_t Database::NumKeypoints() const { return SumColumn("rows", "keypoints"); }
332 
334  return MaxColumn("rows", "keypoints");
335 }
336 
337 size_t Database::NumKeypointsForImage(const image_t image_id) const {
338  return CountRowsForEntry(sql_stmt_num_keypoints_, image_id);
339 }
340 
341 size_t Database::NumDescriptors() const {
342  return SumColumn("rows", "descriptors");
343 }
344 
346  return MaxColumn("rows", "descriptors");
347 }
348 
349 size_t Database::NumDescriptorsForImage(const image_t image_id) const {
350  return CountRowsForEntry(sql_stmt_num_descriptors_, image_id);
351 }
352 
353 size_t Database::NumMatches() const { return SumColumn("rows", "matches"); }
354 
356  return SumColumn("rows", "two_view_geometries");
357 }
358 
359 size_t Database::NumMatchedImagePairs() const { return CountRows("matches"); }
360 
362  return CountRows("two_view_geometries");
363 }
364 
365 Camera Database::ReadCamera(const camera_t camera_id) const {
366  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt_read_camera_, 1, camera_id));
367 
368  Camera camera;
369 
370  const int rc = SQLITE3_CALL(sqlite3_step(sql_stmt_read_camera_));
371  if (rc == SQLITE_ROW) {
372  camera = ReadCameraRow(sql_stmt_read_camera_);
373  }
374 
375  SQLITE3_CALL(sqlite3_reset(sql_stmt_read_camera_));
376 
377  return camera;
378 }
379 
380 std::vector<Camera> Database::ReadAllCameras() const {
381  std::vector<Camera> cameras;
382 
383  while (SQLITE3_CALL(sqlite3_step(sql_stmt_read_cameras_)) == SQLITE_ROW) {
384  cameras.push_back(ReadCameraRow(sql_stmt_read_cameras_));
385  }
386 
387  SQLITE3_CALL(sqlite3_reset(sql_stmt_read_cameras_));
388 
389  return cameras;
390 }
391 
392 Image Database::ReadImage(const image_t image_id) const {
393  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt_read_image_id_, 1, image_id));
394 
395  Image image;
396 
397  const int rc = SQLITE3_CALL(sqlite3_step(sql_stmt_read_image_id_));
398  if (rc == SQLITE_ROW) {
399  image = ReadImageRow(sql_stmt_read_image_id_);
400  }
401 
402  SQLITE3_CALL(sqlite3_reset(sql_stmt_read_image_id_));
403 
404  return image;
405 }
406 
407 Image Database::ReadImageWithName(const std::string& name) const {
408  SQLITE3_CALL(sqlite3_bind_text(sql_stmt_read_image_name_, 1, name.c_str(),
409  static_cast<int>(name.size()), SQLITE_STATIC));
410 
411  Image image;
412 
413  const int rc = SQLITE3_CALL(sqlite3_step(sql_stmt_read_image_name_));
414  if (rc == SQLITE_ROW) {
415  image = ReadImageRow(sql_stmt_read_image_name_);
416  }
417 
418  SQLITE3_CALL(sqlite3_reset(sql_stmt_read_image_name_));
419 
420  return image;
421 }
422 
423 std::vector<Image> Database::ReadAllImages() const {
424  std::vector<Image> images;
425  images.reserve(NumImages());
426 
427  while (SQLITE3_CALL(sqlite3_step(sql_stmt_read_images_)) == SQLITE_ROW) {
428  images.push_back(ReadImageRow(sql_stmt_read_images_));
429  }
430 
431  SQLITE3_CALL(sqlite3_reset(sql_stmt_read_images_));
432 
433  return images;
434 }
435 
437  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt_read_keypoints_, 1, image_id));
438 
439  const int rc = SQLITE3_CALL(sqlite3_step(sql_stmt_read_keypoints_));
440  const FeatureKeypointsBlob blob = ReadDynamicMatrixBlob<FeatureKeypointsBlob>(
441  sql_stmt_read_keypoints_, rc, 0);
442 
443  SQLITE3_CALL(sqlite3_reset(sql_stmt_read_keypoints_));
444 
445  return FeatureKeypointsFromBlob(blob);
446 }
447 
449  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt_read_descriptors_, 1, image_id));
450 
451  const int rc = SQLITE3_CALL(sqlite3_step(sql_stmt_read_descriptors_));
453  ReadDynamicMatrixBlob<FeatureDescriptors>(sql_stmt_read_descriptors_, rc,
454  0);
455 
456  SQLITE3_CALL(sqlite3_reset(sql_stmt_read_descriptors_));
457 
458  return descriptors;
459 }
460 
462  image_t image_id2) const {
463  const image_pair_t pair_id = ImagePairToPairId(image_id1, image_id2);
464  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt_read_matches_, 1, pair_id));
465 
466  const int rc = SQLITE3_CALL(sqlite3_step(sql_stmt_read_matches_));
467  FeatureMatchesBlob blob =
468  ReadDynamicMatrixBlob<FeatureMatchesBlob>(sql_stmt_read_matches_, rc, 0);
469 
470  SQLITE3_CALL(sqlite3_reset(sql_stmt_read_matches_));
471 
472  if (SwapImagePair(image_id1, image_id2)) {
473  SwapFeatureMatchesBlob(&blob);
474  }
475 
476  return FeatureMatchesFromBlob(blob);
477 }
478 
479 std::vector<std::pair<image_pair_t, FeatureMatches>> Database::ReadAllMatches()
480  const {
481  std::vector<std::pair<image_pair_t, FeatureMatches>> all_matches;
482 
483  int rc;
484  while ((rc = SQLITE3_CALL(sqlite3_step(sql_stmt_read_matches_all_))) ==
485  SQLITE_ROW) {
486  const image_pair_t pair_id = static_cast<image_pair_t>(
487  sqlite3_column_int64(sql_stmt_read_matches_all_, 0));
488  const FeatureMatchesBlob blob = ReadDynamicMatrixBlob<FeatureMatchesBlob>(
489  sql_stmt_read_matches_all_, rc, 1);
490  all_matches.emplace_back(pair_id, FeatureMatchesFromBlob(blob));
491  }
492 
493  SQLITE3_CALL(sqlite3_reset(sql_stmt_read_matches_all_));
494 
495  return all_matches;
496 }
497 
499  const image_t image_id2) const {
500  const image_pair_t pair_id = ImagePairToPairId(image_id1, image_id2);
501  SQLITE3_CALL(
502  sqlite3_bind_int64(sql_stmt_read_two_view_geometry_, 1, pair_id));
503 
504  const int rc = SQLITE3_CALL(sqlite3_step(sql_stmt_read_two_view_geometry_));
505 
506  TwoViewGeometry two_view_geometry;
507 
508  FeatureMatchesBlob blob = ReadDynamicMatrixBlob<FeatureMatchesBlob>(
509  sql_stmt_read_two_view_geometry_, rc, 0);
510 
511  two_view_geometry.config = static_cast<int>(
512  sqlite3_column_int64(sql_stmt_read_two_view_geometry_, 3));
513 
514  two_view_geometry.F = ReadStaticMatrixBlob<Eigen::Matrix3d>(
515  sql_stmt_read_two_view_geometry_, rc, 4);
516  two_view_geometry.E = ReadStaticMatrixBlob<Eigen::Matrix3d>(
517  sql_stmt_read_two_view_geometry_, rc, 5);
518  two_view_geometry.H = ReadStaticMatrixBlob<Eigen::Matrix3d>(
519  sql_stmt_read_two_view_geometry_, rc, 6);
520  two_view_geometry.qvec = ReadStaticMatrixBlob<Eigen::Vector4d>(
521  sql_stmt_read_two_view_geometry_, rc, 7);
522  two_view_geometry.tvec = ReadStaticMatrixBlob<Eigen::Vector3d>(
523  sql_stmt_read_two_view_geometry_, rc, 8);
524 
525  SQLITE3_CALL(sqlite3_reset(sql_stmt_read_two_view_geometry_));
526 
527  two_view_geometry.inlier_matches = FeatureMatchesFromBlob(blob);
528  two_view_geometry.F.transposeInPlace();
529  two_view_geometry.E.transposeInPlace();
530  two_view_geometry.H.transposeInPlace();
531 
532  if (SwapImagePair(image_id1, image_id2)) {
533  two_view_geometry.Invert();
534  }
535 
536  return two_view_geometry;
537 }
538 
540  std::vector<image_pair_t>* image_pair_ids,
541  std::vector<TwoViewGeometry>* two_view_geometries) const {
542  int rc;
543  while ((rc = SQLITE3_CALL(sqlite3_step(
544  sql_stmt_read_two_view_geometries_))) == SQLITE_ROW) {
545  const image_pair_t pair_id = static_cast<image_pair_t>(
546  sqlite3_column_int64(sql_stmt_read_two_view_geometries_, 0));
547  image_pair_ids->push_back(pair_id);
548 
549  TwoViewGeometry two_view_geometry;
550 
551  const FeatureMatchesBlob blob = ReadDynamicMatrixBlob<FeatureMatchesBlob>(
552  sql_stmt_read_two_view_geometries_, rc, 1);
553  two_view_geometry.inlier_matches = FeatureMatchesFromBlob(blob);
554 
555  two_view_geometry.config = static_cast<int>(
556  sqlite3_column_int64(sql_stmt_read_two_view_geometries_, 4));
557 
558  two_view_geometry.F = ReadStaticMatrixBlob<Eigen::Matrix3d>(
559  sql_stmt_read_two_view_geometries_, rc, 5);
560  two_view_geometry.E = ReadStaticMatrixBlob<Eigen::Matrix3d>(
561  sql_stmt_read_two_view_geometries_, rc, 6);
562  two_view_geometry.H = ReadStaticMatrixBlob<Eigen::Matrix3d>(
563  sql_stmt_read_two_view_geometries_, rc, 7);
564  two_view_geometry.qvec = ReadStaticMatrixBlob<Eigen::Vector4d>(
565  sql_stmt_read_two_view_geometries_, rc, 8);
566  two_view_geometry.tvec = ReadStaticMatrixBlob<Eigen::Vector3d>(
567  sql_stmt_read_two_view_geometries_, rc, 9);
568 
569  two_view_geometry.F.transposeInPlace();
570  two_view_geometry.E.transposeInPlace();
571  two_view_geometry.H.transposeInPlace();
572 
573  two_view_geometries->push_back(two_view_geometry);
574  }
575 
576  SQLITE3_CALL(sqlite3_reset(sql_stmt_read_two_view_geometries_));
577 }
578 
580  std::vector<std::pair<image_t, image_t>>* image_pairs,
581  std::vector<int>* num_inliers) const {
582  const auto num_inlier_matches = NumInlierMatches();
583  image_pairs->reserve(num_inlier_matches);
584  num_inliers->reserve(num_inlier_matches);
585 
586  while (SQLITE3_CALL(sqlite3_step(
587  sql_stmt_read_two_view_geometry_num_inliers_)) == SQLITE_ROW) {
588  image_t image_id1;
589  image_t image_id2;
590  const image_pair_t pair_id = static_cast<image_pair_t>(
591  sqlite3_column_int64(sql_stmt_read_two_view_geometry_num_inliers_, 0));
592  PairIdToImagePair(pair_id, &image_id1, &image_id2);
593  image_pairs->emplace_back(image_id1, image_id2);
594 
595  const int rows = static_cast<int>(
596  sqlite3_column_int64(sql_stmt_read_two_view_geometry_num_inliers_, 1));
597  num_inliers->push_back(rows);
598  }
599 
600  SQLITE3_CALL(sqlite3_reset(sql_stmt_read_two_view_geometry_num_inliers_));
601 }
602 
604  const bool use_camera_id) const {
605  if (use_camera_id) {
606  CHECK(!ExistsCamera(camera.CameraId())) << "camera_id must be unique";
607  SQLITE3_CALL(
608  sqlite3_bind_int64(sql_stmt_add_camera_, 1, camera.CameraId()));
609  } else {
610  SQLITE3_CALL(sqlite3_bind_null(sql_stmt_add_camera_, 1));
611  }
612 
613  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt_add_camera_, 2, camera.ModelId()));
614  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt_add_camera_, 3,
615  static_cast<sqlite3_int64>(camera.Width())));
616  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt_add_camera_, 4,
617  static_cast<sqlite3_int64>(camera.Height())));
618 
619  const size_t num_params_bytes = sizeof(double) * camera.NumParams();
620  SQLITE3_CALL(sqlite3_bind_blob(sql_stmt_add_camera_, 5, camera.ParamsData(),
621  static_cast<int>(num_params_bytes),
622  SQLITE_STATIC));
623 
624  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt_add_camera_, 6,
625  camera.HasPriorFocalLength()));
626 
627  SQLITE3_CALL(sqlite3_step(sql_stmt_add_camera_));
628  SQLITE3_CALL(sqlite3_reset(sql_stmt_add_camera_));
629 
630  return static_cast<camera_t>(sqlite3_last_insert_rowid(database_));
631 }
632 
634  const bool use_image_id) const {
635  if (use_image_id) {
636  CHECK(!ExistsImage(image.ImageId())) << "image_id must be unique";
637  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt_add_image_, 1, image.ImageId()));
638  } else {
639  SQLITE3_CALL(sqlite3_bind_null(sql_stmt_add_image_, 1));
640  }
641 
642  SQLITE3_CALL(sqlite3_bind_text(sql_stmt_add_image_, 2, image.Name().c_str(),
643  static_cast<int>(image.Name().size()),
644  SQLITE_STATIC));
645  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt_add_image_, 3, image.CameraId()));
646 
647  // NaNs are automatically converted to NULLs in SQLite.
648  SQLITE3_CALL(sqlite3_bind_double(sql_stmt_add_image_, 4, image.QvecPrior(0)));
649  SQLITE3_CALL(sqlite3_bind_double(sql_stmt_add_image_, 5, image.QvecPrior(1)));
650  SQLITE3_CALL(sqlite3_bind_double(sql_stmt_add_image_, 6, image.QvecPrior(2)));
651  SQLITE3_CALL(sqlite3_bind_double(sql_stmt_add_image_, 7, image.QvecPrior(3)));
652 
653  // NaNs are automatically converted to NULLs in SQLite.
654  SQLITE3_CALL(sqlite3_bind_double(sql_stmt_add_image_, 8, image.TvecPrior(0)));
655  SQLITE3_CALL(sqlite3_bind_double(sql_stmt_add_image_, 9, image.TvecPrior(1)));
656  SQLITE3_CALL(
657  sqlite3_bind_double(sql_stmt_add_image_, 10, image.TvecPrior(2)));
658 
659  SQLITE3_CALL(sqlite3_step(sql_stmt_add_image_));
660  SQLITE3_CALL(sqlite3_reset(sql_stmt_add_image_));
661 
662  return static_cast<image_t>(sqlite3_last_insert_rowid(database_));
663 }
664 
665 void Database::WriteKeypoints(const image_t image_id,
666  const FeatureKeypoints& keypoints) const {
667  const FeatureKeypointsBlob blob = FeatureKeypointsToBlob(keypoints);
668 
669  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt_write_keypoints_, 1, image_id));
670  WriteDynamicMatrixBlob(sql_stmt_write_keypoints_, blob, 2);
671 
672  SQLITE3_CALL(sqlite3_step(sql_stmt_write_keypoints_));
673  SQLITE3_CALL(sqlite3_reset(sql_stmt_write_keypoints_));
674 }
675 
677  const FeatureDescriptors& descriptors) const {
678  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt_write_descriptors_, 1, image_id));
679  WriteDynamicMatrixBlob(sql_stmt_write_descriptors_, descriptors, 2);
680 
681  SQLITE3_CALL(sqlite3_step(sql_stmt_write_descriptors_));
682  SQLITE3_CALL(sqlite3_reset(sql_stmt_write_descriptors_));
683 }
684 
685 void Database::WriteMatches(const image_t image_id1, const image_t image_id2,
686  const FeatureMatches& matches) const {
687  const image_pair_t pair_id = ImagePairToPairId(image_id1, image_id2);
688  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt_write_matches_, 1, pair_id));
689 
690  // Important: the swapped data must live until the query is executed.
691  FeatureMatchesBlob blob = FeatureMatchesToBlob(matches);
692  if (SwapImagePair(image_id1, image_id2)) {
693  SwapFeatureMatchesBlob(&blob);
694  WriteDynamicMatrixBlob(sql_stmt_write_matches_, blob, 2);
695  } else {
696  WriteDynamicMatrixBlob(sql_stmt_write_matches_, blob, 2);
697  }
698 
699  SQLITE3_CALL(sqlite3_step(sql_stmt_write_matches_));
700  SQLITE3_CALL(sqlite3_reset(sql_stmt_write_matches_));
701 }
702 
704  const image_t image_id1, const image_t image_id2,
705  const TwoViewGeometry& two_view_geometry) const {
706  const image_pair_t pair_id = ImagePairToPairId(image_id1, image_id2);
707  SQLITE3_CALL(
708  sqlite3_bind_int64(sql_stmt_write_two_view_geometry_, 1, pair_id));
709 
710  const TwoViewGeometry* two_view_geometry_ptr = &two_view_geometry;
711 
712  // Invert the two-view geometry if the image pair has to be swapped.
713  std::unique_ptr<TwoViewGeometry> swapped_two_view_geometry;
714  if (SwapImagePair(image_id1, image_id2)) {
715  swapped_two_view_geometry.reset(new TwoViewGeometry());
716  *swapped_two_view_geometry = two_view_geometry;
717  swapped_two_view_geometry->Invert();
718  two_view_geometry_ptr = swapped_two_view_geometry.get();
719  }
720 
721  const FeatureMatchesBlob inlier_matches =
722  FeatureMatchesToBlob(two_view_geometry_ptr->inlier_matches);
723  WriteDynamicMatrixBlob(sql_stmt_write_two_view_geometry_, inlier_matches, 2);
724 
725  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt_write_two_view_geometry_, 5,
726  two_view_geometry_ptr->config));
727 
728  // Transpose the matrices to obtain row-major data layout.
729  // Important: Do not move these objects inside the if-statement, because
730  // the objects must live until `sqlite3_step` is called on the statement.
731  const Eigen::Matrix3d Ft = two_view_geometry_ptr->F.transpose();
732  const Eigen::Matrix3d Et = two_view_geometry_ptr->E.transpose();
733  const Eigen::Matrix3d Ht = two_view_geometry_ptr->H.transpose();
734  const Eigen::Vector4d& qvec = two_view_geometry_ptr->qvec;
735  const Eigen::Vector3d& tvec = two_view_geometry_ptr->tvec;
736 
737  if (two_view_geometry_ptr->inlier_matches.size() > 0) {
738  WriteStaticMatrixBlob(sql_stmt_write_two_view_geometry_, Ft, 6);
739  WriteStaticMatrixBlob(sql_stmt_write_two_view_geometry_, Et, 7);
740  WriteStaticMatrixBlob(sql_stmt_write_two_view_geometry_, Ht, 8);
741  WriteStaticMatrixBlob(sql_stmt_write_two_view_geometry_, qvec, 9);
742  WriteStaticMatrixBlob(sql_stmt_write_two_view_geometry_, tvec, 10);
743  } else {
744  WriteStaticMatrixBlob(sql_stmt_write_two_view_geometry_,
745  Eigen::MatrixXd(0, 0), 6);
746  WriteStaticMatrixBlob(sql_stmt_write_two_view_geometry_,
747  Eigen::MatrixXd(0, 0), 7);
748  WriteStaticMatrixBlob(sql_stmt_write_two_view_geometry_,
749  Eigen::MatrixXd(0, 0), 8);
750  WriteStaticMatrixBlob(sql_stmt_write_two_view_geometry_,
751  Eigen::MatrixXd(0, 0), 9);
752  WriteStaticMatrixBlob(sql_stmt_write_two_view_geometry_,
753  Eigen::MatrixXd(0, 0), 10);
754  }
755 
756  SQLITE3_CALL(sqlite3_step(sql_stmt_write_two_view_geometry_));
757  SQLITE3_CALL(sqlite3_reset(sql_stmt_write_two_view_geometry_));
758 }
759 
760 void Database::UpdateCamera(const Camera& camera) const {
761  SQLITE3_CALL(
762  sqlite3_bind_int64(sql_stmt_update_camera_, 1, camera.ModelId()));
763  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt_update_camera_, 2,
764  static_cast<sqlite3_int64>(camera.Width())));
765  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt_update_camera_, 3,
766  static_cast<sqlite3_int64>(camera.Height())));
767 
768  const size_t num_params_bytes = sizeof(double) * camera.NumParams();
769  SQLITE3_CALL(
770  sqlite3_bind_blob(sql_stmt_update_camera_, 4, camera.ParamsData(),
771  static_cast<int>(num_params_bytes), SQLITE_STATIC));
772 
773  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt_update_camera_, 5,
774  camera.HasPriorFocalLength()));
775 
776  SQLITE3_CALL(
777  sqlite3_bind_int64(sql_stmt_update_camera_, 6, camera.CameraId()));
778 
779  SQLITE3_CALL(sqlite3_step(sql_stmt_update_camera_));
780  SQLITE3_CALL(sqlite3_reset(sql_stmt_update_camera_));
781 }
782 
783 void Database::UpdateImage(const Image& image) const {
784  SQLITE3_CALL(
785  sqlite3_bind_text(sql_stmt_update_image_, 1, image.Name().c_str(),
786  static_cast<int>(image.Name().size()), SQLITE_STATIC));
787  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt_update_image_, 2, image.CameraId()));
788  SQLITE3_CALL(
789  sqlite3_bind_double(sql_stmt_update_image_, 3, image.QvecPrior(0)));
790  SQLITE3_CALL(
791  sqlite3_bind_double(sql_stmt_update_image_, 4, image.QvecPrior(1)));
792  SQLITE3_CALL(
793  sqlite3_bind_double(sql_stmt_update_image_, 5, image.QvecPrior(2)));
794  SQLITE3_CALL(
795  sqlite3_bind_double(sql_stmt_update_image_, 6, image.QvecPrior(3)));
796  SQLITE3_CALL(
797  sqlite3_bind_double(sql_stmt_update_image_, 7, image.TvecPrior(0)));
798  SQLITE3_CALL(
799  sqlite3_bind_double(sql_stmt_update_image_, 8, image.TvecPrior(1)));
800  SQLITE3_CALL(
801  sqlite3_bind_double(sql_stmt_update_image_, 9, image.TvecPrior(2)));
802 
803  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt_update_image_, 10, image.ImageId()));
804 
805  SQLITE3_CALL(sqlite3_step(sql_stmt_update_image_));
806  SQLITE3_CALL(sqlite3_reset(sql_stmt_update_image_));
807 }
808 
809 void Database::DeleteMatches(const image_t image_id1,
810  const image_t image_id2) const {
811  const image_pair_t pair_id = ImagePairToPairId(image_id1, image_id2);
812  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt_delete_matches_, 1,
813  static_cast<sqlite3_int64>(pair_id)));
814  SQLITE3_CALL(sqlite3_step(sql_stmt_delete_matches_));
815  SQLITE3_CALL(sqlite3_reset(sql_stmt_delete_matches_));
816 }
817 
819  const image_t image_id2) const {
820  const image_pair_t pair_id = ImagePairToPairId(image_id1, image_id2);
821  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt_delete_two_view_geometry_, 1,
822  static_cast<sqlite3_int64>(pair_id)));
823  SQLITE3_CALL(sqlite3_step(sql_stmt_delete_two_view_geometry_));
824  SQLITE3_CALL(sqlite3_reset(sql_stmt_delete_two_view_geometry_));
825 }
826 
828  ClearMatches();
831  ClearKeypoints();
832  ClearImages();
833  ClearCameras();
834 }
835 
837  SQLITE3_CALL(sqlite3_step(sql_stmt_clear_cameras_));
838  SQLITE3_CALL(sqlite3_reset(sql_stmt_clear_cameras_));
839 }
840 
841 void Database::ClearImages() const {
842  SQLITE3_CALL(sqlite3_step(sql_stmt_clear_images_));
843  SQLITE3_CALL(sqlite3_reset(sql_stmt_clear_images_));
844 }
845 
847  SQLITE3_CALL(sqlite3_step(sql_stmt_clear_descriptors_));
848  SQLITE3_CALL(sqlite3_reset(sql_stmt_clear_descriptors_));
849 }
850 
852  SQLITE3_CALL(sqlite3_step(sql_stmt_clear_keypoints_));
853  SQLITE3_CALL(sqlite3_reset(sql_stmt_clear_keypoints_));
854 }
855 
857  SQLITE3_CALL(sqlite3_step(sql_stmt_clear_matches_));
858  SQLITE3_CALL(sqlite3_reset(sql_stmt_clear_matches_));
859 }
860 
862  SQLITE3_CALL(sqlite3_step(sql_stmt_clear_two_view_geometries_));
863  SQLITE3_CALL(sqlite3_reset(sql_stmt_clear_two_view_geometries_));
864 }
865 
866 void Database::Merge(const Database& database1, const Database& database2,
867  Database* merged_database) {
868  // Merge the cameras.
869 
870  std::unordered_map<camera_t, camera_t> new_camera_ids1;
871  for (const auto& camera : database1.ReadAllCameras()) {
872  const camera_t new_camera_id = merged_database->WriteCamera(camera);
873  new_camera_ids1.emplace(camera.CameraId(), new_camera_id);
874  }
875 
876  std::unordered_map<camera_t, camera_t> new_camera_ids2;
877  for (const auto& camera : database2.ReadAllCameras()) {
878  const camera_t new_camera_id = merged_database->WriteCamera(camera);
879  new_camera_ids2.emplace(camera.CameraId(), new_camera_id);
880  }
881 
882  // Merge the images.
883 
884  std::unordered_map<image_t, image_t> new_image_ids1;
885  for (auto& image : database1.ReadAllImages()) {
886  image.SetCameraId(new_camera_ids1.at(image.CameraId()));
887  CHECK(!merged_database->ExistsImageWithName(image.Name()))
888  << "The two databases must not contain images with the same name, but "
889  "the there are images with name "
890  << image.Name() << " in both databases";
891  const image_t new_image_id = merged_database->WriteImage(image);
892  new_image_ids1.emplace(image.ImageId(), new_image_id);
893  const auto keypoints = database1.ReadKeypoints(image.ImageId());
894  const auto descriptors = database1.ReadDescriptors(image.ImageId());
895  merged_database->WriteKeypoints(new_image_id, keypoints);
896  merged_database->WriteDescriptors(new_image_id, descriptors);
897  }
898 
899  std::unordered_map<image_t, image_t> new_image_ids2;
900  for (auto& image : database2.ReadAllImages()) {
901  image.SetCameraId(new_camera_ids2.at(image.CameraId()));
902  CHECK(!merged_database->ExistsImageWithName(image.Name()))
903  << "The two databases must not contain images with the same name, but "
904  "the there are images with name "
905  << image.Name() << " in both databases";
906  const image_t new_image_id = merged_database->WriteImage(image);
907  new_image_ids2.emplace(image.ImageId(), new_image_id);
908  const auto keypoints = database2.ReadKeypoints(image.ImageId());
909  const auto descriptors = database2.ReadDescriptors(image.ImageId());
910  merged_database->WriteKeypoints(new_image_id, keypoints);
911  merged_database->WriteDescriptors(new_image_id, descriptors);
912  }
913 
914  // Merge the matches.
915 
916  for (const auto& matches : database1.ReadAllMatches()) {
917  image_t image_id1, image_id2;
918  Database::PairIdToImagePair(matches.first, &image_id1, &image_id2);
919 
920  const image_t new_image_id1 = new_image_ids1.at(image_id1);
921  const image_t new_image_id2 = new_image_ids1.at(image_id2);
922 
923  merged_database->WriteMatches(new_image_id1, new_image_id2, matches.second);
924  }
925 
926  for (const auto& matches : database2.ReadAllMatches()) {
927  image_t image_id1, image_id2;
928  Database::PairIdToImagePair(matches.first, &image_id1, &image_id2);
929 
930  const image_t new_image_id1 = new_image_ids2.at(image_id1);
931  const image_t new_image_id2 = new_image_ids2.at(image_id2);
932 
933  merged_database->WriteMatches(new_image_id1, new_image_id2, matches.second);
934  }
935 
936  // Merge the two-view geometries.
937 
938  {
939  std::vector<image_pair_t> image_pair_ids;
940  std::vector<TwoViewGeometry> two_view_geometries;
941  database1.ReadTwoViewGeometries(&image_pair_ids, &two_view_geometries);
942 
943  for (size_t i = 0; i < two_view_geometries.size(); ++i) {
944  image_t image_id1, image_id2;
945  Database::PairIdToImagePair(image_pair_ids[i], &image_id1, &image_id2);
946 
947  const image_t new_image_id1 = new_image_ids1.at(image_id1);
948  const image_t new_image_id2 = new_image_ids1.at(image_id2);
949 
950  merged_database->WriteTwoViewGeometry(new_image_id1, new_image_id2,
951  two_view_geometries[i]);
952  }
953  }
954 
955  {
956  std::vector<image_pair_t> image_pair_ids;
957  std::vector<TwoViewGeometry> two_view_geometries;
958  database2.ReadTwoViewGeometries(&image_pair_ids, &two_view_geometries);
959 
960  for (size_t i = 0; i < two_view_geometries.size(); ++i) {
961  image_t image_id1, image_id2;
962  Database::PairIdToImagePair(image_pair_ids[i], &image_id1, &image_id2);
963 
964  const image_t new_image_id1 = new_image_ids2.at(image_id1);
965  const image_t new_image_id2 = new_image_ids2.at(image_id2);
966 
967  merged_database->WriteTwoViewGeometry(new_image_id1, new_image_id2,
968  two_view_geometries[i]);
969  }
970  }
971 }
972 
973 void Database::BeginTransaction() const {
974  SQLITE3_EXEC(database_, "BEGIN TRANSACTION", nullptr);
975 }
976 
977 void Database::EndTransaction() const {
978  SQLITE3_EXEC(database_, "END TRANSACTION", nullptr);
979 }
980 
981 void Database::PrepareSQLStatements() {
982  sql_stmts_.clear();
983 
984  std::string sql;
985 
987  // num_*
989  sql = "SELECT rows FROM keypoints WHERE image_id = ?;";
990  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
991  &sql_stmt_num_keypoints_, 0));
992  sql_stmts_.push_back(sql_stmt_num_keypoints_);
993 
994  sql = "SELECT rows FROM descriptors WHERE image_id = ?;";
995  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
996  &sql_stmt_num_descriptors_, 0));
997  sql_stmts_.push_back(sql_stmt_num_descriptors_);
998 
1000  // exists_*
1002  sql = "SELECT 1 FROM cameras WHERE camera_id = ?;";
1003  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1004  &sql_stmt_exists_camera_, 0));
1005  sql_stmts_.push_back(sql_stmt_exists_camera_);
1006 
1007  sql = "SELECT 1 FROM images WHERE image_id = ?;";
1008  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1009  &sql_stmt_exists_image_id_, 0));
1010  sql_stmts_.push_back(sql_stmt_exists_image_id_);
1011 
1012  sql = "SELECT 1 FROM images WHERE name = ?;";
1013  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1014  &sql_stmt_exists_image_name_, 0));
1015  sql_stmts_.push_back(sql_stmt_exists_image_name_);
1016 
1017  sql = "SELECT 1 FROM keypoints WHERE image_id = ?;";
1018  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1019  &sql_stmt_exists_keypoints_, 0));
1020  sql_stmts_.push_back(sql_stmt_exists_keypoints_);
1021 
1022  sql = "SELECT 1 FROM descriptors WHERE image_id = ?;";
1023  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1024  &sql_stmt_exists_descriptors_, 0));
1025  sql_stmts_.push_back(sql_stmt_exists_descriptors_);
1026 
1027  sql = "SELECT 1 FROM matches WHERE pair_id = ?;";
1028  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1029  &sql_stmt_exists_matches_, 0));
1030  sql_stmts_.push_back(sql_stmt_exists_matches_);
1031 
1032  sql = "SELECT 1 FROM two_view_geometries WHERE pair_id = ?;";
1033  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1034  &sql_stmt_exists_two_view_geometry_, 0));
1035  sql_stmts_.push_back(sql_stmt_exists_two_view_geometry_);
1036 
1038  // add_*
1040  sql =
1041  "INSERT INTO cameras(camera_id, model, width, height, params, "
1042  "prior_focal_length) VALUES(?, ?, ?, ?, ?, ?);";
1043  SQLITE3_CALL(
1044  sqlite3_prepare_v2(database_, sql.c_str(), -1, &sql_stmt_add_camera_, 0));
1045  sql_stmts_.push_back(sql_stmt_add_camera_);
1046 
1047  sql =
1048  "INSERT INTO images(image_id, name, camera_id, prior_qw, prior_qx, "
1049  "prior_qy, prior_qz, prior_tx, prior_ty, prior_tz) VALUES(?, ?, ?, ?, ?, "
1050  "?, ?, ?, ?, ?);";
1051  SQLITE3_CALL(
1052  sqlite3_prepare_v2(database_, sql.c_str(), -1, &sql_stmt_add_image_, 0));
1053  sql_stmts_.push_back(sql_stmt_add_image_);
1054 
1056  // update_*
1058  sql =
1059  "UPDATE cameras SET model=?, width=?, height=?, params=?, "
1060  "prior_focal_length=? WHERE camera_id=?;";
1061  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1062  &sql_stmt_update_camera_, 0));
1063  sql_stmts_.push_back(sql_stmt_update_camera_);
1064 
1065  sql =
1066  "UPDATE images SET name=?, camera_id=?, prior_qw=?, prior_qx=?, "
1067  "prior_qy=?, prior_qz=?, prior_tx=?, prior_ty=?, prior_tz=? WHERE "
1068  "image_id=?;";
1069  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1070  &sql_stmt_update_image_, 0));
1071  sql_stmts_.push_back(sql_stmt_update_image_);
1072 
1074  // read_*
1076  sql = "SELECT * FROM cameras WHERE camera_id = ?;";
1077  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1078  &sql_stmt_read_camera_, 0));
1079  sql_stmts_.push_back(sql_stmt_read_camera_);
1080 
1081  sql = "SELECT * FROM cameras;";
1082  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1083  &sql_stmt_read_cameras_, 0));
1084  sql_stmts_.push_back(sql_stmt_read_cameras_);
1085 
1086  sql = "SELECT * FROM images WHERE image_id = ?;";
1087  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1088  &sql_stmt_read_image_id_, 0));
1089  sql_stmts_.push_back(sql_stmt_read_image_id_);
1090 
1091  sql = "SELECT * FROM images WHERE name = ?;";
1092  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1093  &sql_stmt_read_image_name_, 0));
1094  sql_stmts_.push_back(sql_stmt_read_image_name_);
1095 
1096  sql = "SELECT * FROM images;";
1097  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1098  &sql_stmt_read_images_, 0));
1099  sql_stmts_.push_back(sql_stmt_read_images_);
1100 
1101  sql = "SELECT rows, cols, data FROM keypoints WHERE image_id = ?;";
1102  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1103  &sql_stmt_read_keypoints_, 0));
1104  sql_stmts_.push_back(sql_stmt_read_keypoints_);
1105 
1106  sql = "SELECT rows, cols, data FROM descriptors WHERE image_id = ?;";
1107  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1108  &sql_stmt_read_descriptors_, 0));
1109  sql_stmts_.push_back(sql_stmt_read_descriptors_);
1110 
1111  sql = "SELECT rows, cols, data FROM matches WHERE pair_id = ?;";
1112  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1113  &sql_stmt_read_matches_, 0));
1114  sql_stmts_.push_back(sql_stmt_read_matches_);
1115 
1116  sql = "SELECT * FROM matches WHERE rows > 0;";
1117  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1118  &sql_stmt_read_matches_all_, 0));
1119  sql_stmts_.push_back(sql_stmt_read_matches_all_);
1120 
1121  sql =
1122  "SELECT rows, cols, data, config, F, E, H, qvec, tvec FROM "
1123  "two_view_geometries WHERE pair_id = ?;";
1124  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1125  &sql_stmt_read_two_view_geometry_, 0));
1126  sql_stmts_.push_back(sql_stmt_read_two_view_geometry_);
1127 
1128  sql = "SELECT * FROM two_view_geometries WHERE rows > 0;";
1129  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1130  &sql_stmt_read_two_view_geometries_, 0));
1131  sql_stmts_.push_back(sql_stmt_read_two_view_geometries_);
1132 
1133  sql = "SELECT pair_id, rows FROM two_view_geometries WHERE rows > 0;";
1134  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1135  &sql_stmt_read_two_view_geometry_num_inliers_,
1136  0));
1137  sql_stmts_.push_back(sql_stmt_read_two_view_geometry_num_inliers_);
1138 
1140  // write_*
1142  sql = "INSERT INTO keypoints(image_id, rows, cols, data) VALUES(?, ?, ?, ?);";
1143  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1144  &sql_stmt_write_keypoints_, 0));
1145  sql_stmts_.push_back(sql_stmt_write_keypoints_);
1146 
1147  sql =
1148  "INSERT INTO descriptors(image_id, rows, cols, data) VALUES(?, ?, ?, ?);";
1149  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1150  &sql_stmt_write_descriptors_, 0));
1151  sql_stmts_.push_back(sql_stmt_write_descriptors_);
1152 
1153  sql = "INSERT INTO matches(pair_id, rows, cols, data) VALUES(?, ?, ?, ?);";
1154  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1155  &sql_stmt_write_matches_, 0));
1156  sql_stmts_.push_back(sql_stmt_write_matches_);
1157 
1158  sql =
1159  "INSERT INTO two_view_geometries(pair_id, rows, cols, data, config, F, "
1160  "E, H, qvec, tvec) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
1161  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1162  &sql_stmt_write_two_view_geometry_, 0));
1163  sql_stmts_.push_back(sql_stmt_write_two_view_geometry_);
1164 
1166  // delete_*
1168  sql = "DELETE FROM matches WHERE pair_id = ?;";
1169  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1170  &sql_stmt_delete_matches_, 0));
1171  sql_stmts_.push_back(sql_stmt_delete_matches_);
1172 
1173  sql = "DELETE FROM two_view_geometries WHERE pair_id = ?;";
1174  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1175  &sql_stmt_delete_two_view_geometry_, 0));
1176  sql_stmts_.push_back(sql_stmt_delete_two_view_geometry_);
1177 
1179  // clear_*
1181  sql = "DELETE FROM cameras;";
1182  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1183  &sql_stmt_clear_cameras_, 0));
1184  sql_stmts_.push_back(sql_stmt_clear_cameras_);
1185 
1186  sql = "DELETE FROM images;";
1187  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1188  &sql_stmt_clear_images_, 0));
1189  sql_stmts_.push_back(sql_stmt_clear_images_);
1190 
1191  sql = "DELETE FROM descriptors;";
1192  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1193  &sql_stmt_clear_descriptors_, 0));
1194  sql_stmts_.push_back(sql_stmt_clear_descriptors_);
1195 
1196  sql = "DELETE FROM keypoints;";
1197  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1198  &sql_stmt_clear_keypoints_, 0));
1199  sql_stmts_.push_back(sql_stmt_clear_keypoints_);
1200 
1201  sql = "DELETE FROM matches;";
1202  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1203  &sql_stmt_clear_matches_, 0));
1204  sql_stmts_.push_back(sql_stmt_clear_matches_);
1205 
1206  sql = "DELETE FROM two_view_geometries;";
1207  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1,
1208  &sql_stmt_clear_two_view_geometries_, 0));
1209  sql_stmts_.push_back(sql_stmt_clear_two_view_geometries_);
1210 }
1211 
1212 void Database::FinalizeSQLStatements() {
1213  for (const auto& sql_stmt : sql_stmts_) {
1214  SQLITE3_CALL(sqlite3_finalize(sql_stmt));
1215  }
1216 }
1217 
1218 void Database::CreateTables() const {
1219  CreateCameraTable();
1220  CreateImageTable();
1221  CreateKeypointsTable();
1222  CreateDescriptorsTable();
1223  CreateMatchesTable();
1224  CreateTwoViewGeometriesTable();
1225 }
1226 
1227 void Database::CreateCameraTable() const {
1228  const std::string sql =
1229  "CREATE TABLE IF NOT EXISTS cameras"
1230  " (camera_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
1231  " model INTEGER NOT NULL,"
1232  " width INTEGER NOT NULL,"
1233  " height INTEGER NOT NULL,"
1234  " params BLOB,"
1235  " prior_focal_length INTEGER NOT NULL);";
1236 
1237  SQLITE3_EXEC(database_, sql.c_str(), nullptr);
1238 }
1239 
1240 void Database::CreateImageTable() const {
1241  const std::string sql = StringPrintf(
1242  "CREATE TABLE IF NOT EXISTS images"
1243  " (image_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
1244  " name TEXT NOT NULL UNIQUE,"
1245  " camera_id INTEGER NOT NULL,"
1246  " prior_qw REAL,"
1247  " prior_qx REAL,"
1248  " prior_qy REAL,"
1249  " prior_qz REAL,"
1250  " prior_tx REAL,"
1251  " prior_ty REAL,"
1252  " prior_tz REAL,"
1253  "CONSTRAINT image_id_check CHECK(image_id >= 0 and image_id < %d),"
1254  "FOREIGN KEY(camera_id) REFERENCES cameras(camera_id));"
1255  "CREATE UNIQUE INDEX IF NOT EXISTS index_name ON images(name);",
1256  kMaxNumImages);
1257 
1258  SQLITE3_EXEC(database_, sql.c_str(), nullptr);
1259 }
1260 
1261 void Database::CreateKeypointsTable() const {
1262  const std::string sql =
1263  "CREATE TABLE IF NOT EXISTS keypoints"
1264  " (image_id INTEGER PRIMARY KEY NOT NULL,"
1265  " rows INTEGER NOT NULL,"
1266  " cols INTEGER NOT NULL,"
1267  " data BLOB,"
1268  "FOREIGN KEY(image_id) REFERENCES images(image_id) ON DELETE CASCADE);";
1269 
1270  SQLITE3_EXEC(database_, sql.c_str(), nullptr);
1271 }
1272 
1273 void Database::CreateDescriptorsTable() const {
1274  const std::string sql =
1275  "CREATE TABLE IF NOT EXISTS descriptors"
1276  " (image_id INTEGER PRIMARY KEY NOT NULL,"
1277  " rows INTEGER NOT NULL,"
1278  " cols INTEGER NOT NULL,"
1279  " data BLOB,"
1280  "FOREIGN KEY(image_id) REFERENCES images(image_id) ON DELETE CASCADE);";
1281 
1282  SQLITE3_EXEC(database_, sql.c_str(), nullptr);
1283 }
1284 
1285 void Database::CreateMatchesTable() const {
1286  const std::string sql =
1287  "CREATE TABLE IF NOT EXISTS matches"
1288  " (pair_id INTEGER PRIMARY KEY NOT NULL,"
1289  " rows INTEGER NOT NULL,"
1290  " cols INTEGER NOT NULL,"
1291  " data BLOB);";
1292 
1293  SQLITE3_EXEC(database_, sql.c_str(), nullptr);
1294 }
1295 
1296 void Database::CreateTwoViewGeometriesTable() const {
1297  if (ExistsTable("inlier_matches")) {
1298  SQLITE3_EXEC(database_,
1299  "ALTER TABLE inlier_matches RENAME TO two_view_geometries;",
1300  nullptr);
1301  } else {
1302  const std::string sql =
1303  "CREATE TABLE IF NOT EXISTS two_view_geometries"
1304  " (pair_id INTEGER PRIMARY KEY NOT NULL,"
1305  " rows INTEGER NOT NULL,"
1306  " cols INTEGER NOT NULL,"
1307  " data BLOB,"
1308  " config INTEGER NOT NULL,"
1309  " F BLOB,"
1310  " E BLOB,"
1311  " H BLOB,"
1312  " qvec BLOB,"
1313  " tvec BLOB);";
1314  SQLITE3_EXEC(database_, sql.c_str(), nullptr);
1315  }
1316 }
1317 
1318 void Database::UpdateSchema() const {
1319  if (!ExistsColumn("two_view_geometries", "F")) {
1320  SQLITE3_EXEC(database_,
1321  "ALTER TABLE two_view_geometries ADD COLUMN F BLOB;", nullptr);
1322  }
1323 
1324  if (!ExistsColumn("two_view_geometries", "E")) {
1325  SQLITE3_EXEC(database_,
1326  "ALTER TABLE two_view_geometries ADD COLUMN E BLOB;", nullptr);
1327  }
1328 
1329  if (!ExistsColumn("two_view_geometries", "H")) {
1330  SQLITE3_EXEC(database_,
1331  "ALTER TABLE two_view_geometries ADD COLUMN H BLOB;", nullptr);
1332  }
1333 
1334  if (!ExistsColumn("two_view_geometries", "qvec")) {
1335  SQLITE3_EXEC(database_,
1336  "ALTER TABLE two_view_geometries ADD COLUMN qvec BLOB;",
1337  nullptr);
1338  }
1339 
1340  if (!ExistsColumn("two_view_geometries", "tvec")) {
1341  SQLITE3_EXEC(database_,
1342  "ALTER TABLE two_view_geometries ADD COLUMN tvec BLOB;",
1343  nullptr);
1344  }
1345 
1346  // Update user version number.
1347  std::unique_lock<std::mutex> lock(update_schema_mutex_);
1348  const std::string update_user_version_sql =
1349  StringPrintf("PRAGMA user_version = %d;", COLMAP_VERSION_NUMBER);
1350  SQLITE3_EXEC(database_, update_user_version_sql.c_str(), nullptr);
1351 }
1352 
1353 bool Database::ExistsTable(const std::string& table_name) const {
1354  const std::string sql =
1355  "SELECT name FROM sqlite_master WHERE type='table' AND name = ?;";
1356 
1357  sqlite3_stmt* sql_stmt;
1358  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1, &sql_stmt, 0));
1359 
1360  SQLITE3_CALL(sqlite3_bind_text(sql_stmt, 1, table_name.c_str(),
1361  static_cast<int>(table_name.size()),
1362  SQLITE_STATIC));
1363 
1364  const bool exists = SQLITE3_CALL(sqlite3_step(sql_stmt)) == SQLITE_ROW;
1365 
1366  SQLITE3_CALL(sqlite3_finalize(sql_stmt));
1367 
1368  return exists;
1369 }
1370 
1371 bool Database::ExistsColumn(const std::string& table_name,
1372  const std::string& column_name) const {
1373  const std::string sql =
1374  StringPrintf("PRAGMA table_info(%s);", table_name.c_str());
1375 
1376  sqlite3_stmt* sql_stmt;
1377  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1, &sql_stmt, 0));
1378 
1379  bool exists_column = false;
1380  while (SQLITE3_CALL(sqlite3_step(sql_stmt)) == SQLITE_ROW) {
1381  const std::string result =
1382  reinterpret_cast<const char*>(sqlite3_column_text(sql_stmt, 1));
1383  if (column_name == result) {
1384  exists_column = true;
1385  break;
1386  }
1387  }
1388 
1389  SQLITE3_CALL(sqlite3_finalize(sql_stmt));
1390 
1391  return exists_column;
1392 }
1393 
1394 bool Database::ExistsRowId(sqlite3_stmt* sql_stmt,
1395  const sqlite3_int64 row_id) const {
1396  SQLITE3_CALL(
1397  sqlite3_bind_int64(sql_stmt, 1, static_cast<sqlite3_int64>(row_id)));
1398 
1399  const bool exists = SQLITE3_CALL(sqlite3_step(sql_stmt)) == SQLITE_ROW;
1400 
1401  SQLITE3_CALL(sqlite3_reset(sql_stmt));
1402 
1403  return exists;
1404 }
1405 
1406 bool Database::ExistsRowString(sqlite3_stmt* sql_stmt,
1407  const std::string& row_entry) const {
1408  SQLITE3_CALL(sqlite3_bind_text(sql_stmt, 1, row_entry.c_str(),
1409  static_cast<int>(row_entry.size()),
1410  SQLITE_STATIC));
1411 
1412  const bool exists = SQLITE3_CALL(sqlite3_step(sql_stmt)) == SQLITE_ROW;
1413 
1414  SQLITE3_CALL(sqlite3_reset(sql_stmt));
1415 
1416  return exists;
1417 }
1418 
1419 size_t Database::CountRows(const std::string& table) const {
1420  const std::string sql =
1421  StringPrintf("SELECT COUNT(*) FROM %s;", table.c_str());
1422 
1423  sqlite3_stmt* sql_stmt;
1424  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1, &sql_stmt, 0));
1425 
1426  size_t count = 0;
1427  const int rc = SQLITE3_CALL(sqlite3_step(sql_stmt));
1428  if (rc == SQLITE_ROW) {
1429  count = static_cast<size_t>(sqlite3_column_int64(sql_stmt, 0));
1430  }
1431 
1432  SQLITE3_CALL(sqlite3_finalize(sql_stmt));
1433 
1434  return count;
1435 }
1436 
1437 size_t Database::CountRowsForEntry(sqlite3_stmt* sql_stmt,
1438  const sqlite3_int64 row_id) const {
1439  SQLITE3_CALL(sqlite3_bind_int64(sql_stmt, 1, row_id));
1440 
1441  size_t count = 0;
1442  const int rc = SQLITE3_CALL(sqlite3_step(sql_stmt));
1443  if (rc == SQLITE_ROW) {
1444  count = static_cast<size_t>(sqlite3_column_int64(sql_stmt, 0));
1445  }
1446 
1447  SQLITE3_CALL(sqlite3_reset(sql_stmt));
1448 
1449  return count;
1450 }
1451 
1452 size_t Database::SumColumn(const std::string& column,
1453  const std::string& table) const {
1454  const std::string sql =
1455  StringPrintf("SELECT SUM(%s) FROM %s;", column.c_str(), table.c_str());
1456 
1457  sqlite3_stmt* sql_stmt;
1458  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1, &sql_stmt, 0));
1459 
1460  size_t sum = 0;
1461  const int rc = SQLITE3_CALL(sqlite3_step(sql_stmt));
1462  if (rc == SQLITE_ROW) {
1463  sum = static_cast<size_t>(sqlite3_column_int64(sql_stmt, 0));
1464  }
1465 
1466  SQLITE3_CALL(sqlite3_finalize(sql_stmt));
1467 
1468  return sum;
1469 }
1470 
1471 size_t Database::MaxColumn(const std::string& column,
1472  const std::string& table) const {
1473  const std::string sql =
1474  StringPrintf("SELECT MAX(%s) FROM %s;", column.c_str(), table.c_str());
1475 
1476  sqlite3_stmt* sql_stmt;
1477  SQLITE3_CALL(sqlite3_prepare_v2(database_, sql.c_str(), -1, &sql_stmt, 0));
1478 
1479  size_t max = 0;
1480  const int rc = SQLITE3_CALL(sqlite3_step(sql_stmt));
1481  if (rc == SQLITE_ROW) {
1482  max = static_cast<size_t>(sqlite3_column_int64(sql_stmt, 0));
1483  }
1484 
1485  SQLITE3_CALL(sqlite3_finalize(sql_stmt));
1486 
1487  return max;
1488 }
1489 
1491  : database_(database), database_lock_(database->transaction_mutex_) {
1492  CHECK_NOTNULL(database_);
1493  database_->BeginTransaction();
1494 }
1495 
1496 DatabaseTransaction::~DatabaseTransaction() { database_->EndTransaction(); }
1497 
1498 } // namespace colmap
std::shared_ptr< core::Tensor > image
std::string name
int count
core::Tensor result
Definition: VtkUtils.cpp:76
camera_t CameraId() const
Definition: camera.h:154
int ModelId() const
Definition: camera.h:158
bool HasPriorFocalLength() const
Definition: camera.h:168
size_t NumParams() const
Definition: camera.h:174
size_t Width() const
Definition: camera.h:160
size_t Height() const
Definition: camera.h:162
const double * ParamsData() const
Definition: camera.h:184
DatabaseTransaction(Database *database)
Definition: database.cc:1490
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
bool ExistsKeypoints(const image_t image_id) const
Definition: database.cc:307
size_t NumKeypointsForImage(const image_t image_id) const
Definition: database.cc:337
bool ExistsInlierMatches(const image_t image_id1, const image_t image_id2) const
Definition: database.cc:321
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 Open(const std::string &path)
Definition: database.cc:254
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
bool ExistsDescriptors(const image_t image_id) const
Definition: database.cc:311
bool ExistsImageWithName(std::string name) const
Definition: database.cc:303
void UpdateCamera(const Camera &camera) const
Definition: database.cc:760
Image ReadImageWithName(const std::string &name) const
Definition: database.cc:407
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
static const std::string path
Definition: PointCloud.cpp:59
uint64_t image_pair_t
Definition: types.h:64
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::string StringPrintf(const char *format,...)
Definition: string.cc:131
uint32_t camera_t
Definition: types.h:58
std::vector< FeatureMatch > FeatureMatches
Definition: types.h:80
Eigen::MatrixXd::Index Index
Definition: knncpp.h:26
CorePointDescSet * descriptors
#define SQLITE3_EXEC(database, sql, callback)
Definition: sqlite3_utils.h:35
#define SQLITE3_CALL(func)
Definition: sqlite3_utils.h:33