12 #include <unordered_map>
15 #include "SQLite/sqlite3.h"
129 const image_t image_id2)
const;
130 std::vector<std::pair<image_pair_t, FeatureMatches>>
ReadAllMatches()
const;
133 const image_t image_id2)
const;
135 std::vector<image_pair_t>* image_pair_ids,
136 std::vector<TwoViewGeometry>* two_view_geometries)
const;
141 std::vector<std::pair<image_t, image_t>>* image_pairs,
142 std::vector<int>* num_inliers)
const;
147 const bool use_camera_id =
false)
const;
152 const bool use_image_id =
false)
const;
181 const image_t image_id2)
const;
217 void BeginTransaction()
const;
218 void EndTransaction()
const;
222 void PrepareSQLStatements();
223 void FinalizeSQLStatements();
226 void CreateTables()
const;
227 void CreateCameraTable()
const;
228 void CreateImageTable()
const;
229 void CreateKeypointsTable()
const;
230 void CreateDescriptorsTable()
const;
231 void CreateMatchesTable()
const;
232 void CreateTwoViewGeometriesTable()
const;
234 void UpdateSchema()
const;
236 bool ExistsTable(
const std::string& table_name)
const;
237 bool ExistsColumn(
const std::string& table_name,
238 const std::string& column_name)
const;
240 bool ExistsRowId(sqlite3_stmt* sql_stmt,
const sqlite3_int64 row_id)
const;
241 bool ExistsRowString(sqlite3_stmt* sql_stmt,
242 const std::string& row_entry)
const;
244 size_t CountRows(
const std::string& table)
const;
245 size_t CountRowsForEntry(sqlite3_stmt* sql_stmt,
246 const sqlite3_int64 row_id)
const;
247 size_t SumColumn(
const std::string& column,
const std::string& table)
const;
248 size_t MaxColumn(
const std::string& column,
const std::string& table)
const;
250 sqlite3* database_ =
nullptr;
257 static std::mutex update_schema_mutex_;
260 std::mutex transaction_mutex_;
264 std::vector<sqlite3_stmt*> sql_stmts_;
267 sqlite3_stmt* sql_stmt_num_keypoints_ =
nullptr;
268 sqlite3_stmt* sql_stmt_num_descriptors_ =
nullptr;
271 sqlite3_stmt* sql_stmt_exists_camera_ =
nullptr;
272 sqlite3_stmt* sql_stmt_exists_image_id_ =
nullptr;
273 sqlite3_stmt* sql_stmt_exists_image_name_ =
nullptr;
274 sqlite3_stmt* sql_stmt_exists_keypoints_ =
nullptr;
275 sqlite3_stmt* sql_stmt_exists_descriptors_ =
nullptr;
276 sqlite3_stmt* sql_stmt_exists_matches_ =
nullptr;
277 sqlite3_stmt* sql_stmt_exists_two_view_geometry_ =
nullptr;
280 sqlite3_stmt* sql_stmt_add_camera_ =
nullptr;
281 sqlite3_stmt* sql_stmt_add_image_ =
nullptr;
284 sqlite3_stmt* sql_stmt_update_camera_ =
nullptr;
285 sqlite3_stmt* sql_stmt_update_image_ =
nullptr;
288 sqlite3_stmt* sql_stmt_read_camera_ =
nullptr;
289 sqlite3_stmt* sql_stmt_read_cameras_ =
nullptr;
290 sqlite3_stmt* sql_stmt_read_image_id_ =
nullptr;
291 sqlite3_stmt* sql_stmt_read_image_name_ =
nullptr;
292 sqlite3_stmt* sql_stmt_read_images_ =
nullptr;
293 sqlite3_stmt* sql_stmt_read_keypoints_ =
nullptr;
294 sqlite3_stmt* sql_stmt_read_descriptors_ =
nullptr;
295 sqlite3_stmt* sql_stmt_read_matches_ =
nullptr;
296 sqlite3_stmt* sql_stmt_read_matches_all_ =
nullptr;
297 sqlite3_stmt* sql_stmt_read_two_view_geometry_ =
nullptr;
298 sqlite3_stmt* sql_stmt_read_two_view_geometries_ =
nullptr;
299 sqlite3_stmt* sql_stmt_read_two_view_geometry_num_inliers_ =
nullptr;
302 sqlite3_stmt* sql_stmt_write_keypoints_ =
nullptr;
303 sqlite3_stmt* sql_stmt_write_descriptors_ =
nullptr;
304 sqlite3_stmt* sql_stmt_write_matches_ =
nullptr;
305 sqlite3_stmt* sql_stmt_write_two_view_geometry_ =
nullptr;
308 sqlite3_stmt* sql_stmt_delete_matches_ =
nullptr;
309 sqlite3_stmt* sql_stmt_delete_two_view_geometry_ =
nullptr;
312 sqlite3_stmt* sql_stmt_clear_cameras_ =
nullptr;
313 sqlite3_stmt* sql_stmt_clear_images_ =
nullptr;
314 sqlite3_stmt* sql_stmt_clear_descriptors_ =
nullptr;
315 sqlite3_stmt* sql_stmt_clear_keypoints_ =
nullptr;
316 sqlite3_stmt* sql_stmt_clear_matches_ =
nullptr;
317 sqlite3_stmt* sql_stmt_clear_two_view_geometries_ =
nullptr;
332 std::unique_lock<std::mutex> database_lock_;
341 CHECK_GE(image_id1, 0);
342 CHECK_GE(image_id2, 0);
357 CHECK_GE(*image_id1, 0);
358 CHECK_GE(*image_id2, 0);
367 return image_id1 > image_id2;
std::shared_ptr< core::Tensor > image
DatabaseTransaction(Database *database)
void ClearCameras() const
void WriteDescriptors(const image_t image_id, const FeatureDescriptors &descriptors) const
size_t NumMatches() const
static const size_t kMaxNumImages
FeatureDescriptors ReadDescriptors(const image_t image_id) const
void ClearDescriptors() const
static void Merge(const Database &database1, const Database &database2, Database *merged_database)
size_t NumMatchedImagePairs() const
void ReadTwoViewGeometryNumInliers(std::vector< std::pair< image_t, image_t >> *image_pairs, std::vector< int > *num_inliers) const
size_t MaxNumDescriptors() const
void ClearAllTables() const
FeatureMatches ReadMatches(const image_t image_id1, const image_t image_id2) const
bool ExistsImage(const image_t image_id) const
void DeleteInlierMatches(const image_t image_id1, const image_t image_id2) const
void WriteMatches(const image_t image_id1, const image_t image_id2, const FeatureMatches &matches) const
bool ExistsMatches(const image_t image_id1, const image_t image_id2) const
FeatureKeypoints ReadKeypoints(const image_t image_id) const
size_t NumInlierMatches() const
void ClearKeypoints() const
size_t NumDescriptors() const
size_t NumKeypoints() const
void WriteTwoViewGeometry(const image_t image_id1, const image_t image_id2, const TwoViewGeometry &two_view_geometry) const
size_t NumVerifiedImagePairs() const
void WriteKeypoints(const image_t image_id, const FeatureKeypoints &keypoints) const
std::vector< std::pair< image_pair_t, FeatureMatches > > ReadAllMatches() const
static image_pair_t ImagePairToPairId(const image_t image_id1, const image_t image_id2)
bool ExistsKeypoints(const image_t image_id) const
size_t NumKeypointsForImage(const image_t image_id) const
bool ExistsInlierMatches(const image_t image_id1, const image_t image_id2) const
std::vector< Camera > ReadAllCameras() const
bool ExistsCamera(const camera_t camera_id) const
void DeleteMatches(const image_t image_id1, const image_t image_id2) const
size_t NumDescriptorsForImage(const image_t image_id) const
void ReadTwoViewGeometries(std::vector< image_pair_t > *image_pair_ids, std::vector< TwoViewGeometry > *two_view_geometries) const
void Open(const std::string &path)
void ClearTwoViewGeometries() const
static bool SwapImagePair(const image_t image_id1, const image_t image_id2)
void ClearMatches() const
bool ExistsDescriptors(const image_t image_id) const
bool ExistsImageWithName(std::string name) const
void UpdateCamera(const Camera &camera) const
Image ReadImageWithName(const std::string &name) const
size_t MaxNumKeypoints() const
static const int kSchemaVersion
TwoViewGeometry ReadTwoViewGeometry(const image_t image_id1, const image_t image_id2) const
static void PairIdToImagePair(const image_pair_t pair_id, image_t *image_id1, image_t *image_id2)
Camera ReadCamera(const camera_t camera_id) const
void UpdateImage(const Image &image) const
image_t WriteImage(const Image &image, const bool use_image_id=false) const
size_t NumCameras() const
std::vector< Image > ReadAllImages() const
camera_t WriteCamera(const Camera &camera, const bool use_camera_id=false) const
Image ReadImage(const image_t image_id) const
static const std::string path
Eigen::Matrix< uint8_t, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > FeatureDescriptors
std::vector< FeatureKeypoint > FeatureKeypoints
std::vector< FeatureMatch > FeatureMatches
#define NON_COPYABLE(class_name)
#define NON_MOVABLE(class_name)