File size: 5,590 Bytes
2b5a2b6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
// Copyright (c) 2022, ETH Zurich and UNC Chapel Hill.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// * Neither the name of ETH Zurich and UNC Chapel Hill nor the names of
// its contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// Author: Johannes L. Schoenberger (jsch-at-demuc-dot-de)
#ifndef COLMAP_SRC_BASE_DATABASE_CACHE_H_
#define COLMAP_SRC_BASE_DATABASE_CACHE_H_
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include <Eigen/Core>
#include "base/camera.h"
#include "base/camera_models.h"
#include "base/correspondence_graph.h"
#include "base/database.h"
#include "base/image.h"
#include "util/alignment.h"
#include "util/types.h"
namespace colmap {
// A class that caches the contents of the database in memory, used to quickly
// create new reconstruction instances when multiple models are reconstructed.
class DatabaseCache {
public:
DatabaseCache();
// Get number of objects.
inline size_t NumCameras() const;
inline size_t NumImages() const;
// Get specific objects.
inline class Camera& Camera(const camera_t camera_id);
inline const class Camera& Camera(const camera_t camera_id) const;
inline class Image& Image(const image_t image_id);
inline const class Image& Image(const image_t image_id) const;
// Get all objects.
inline const EIGEN_STL_UMAP(camera_t, class Camera) & Cameras() const;
inline const EIGEN_STL_UMAP(image_t, class Image) & Images() const;
// Check whether specific object exists.
inline bool ExistsCamera(const camera_t camera_id) const;
inline bool ExistsImage(const image_t image_id) const;
// Get reference to correspondence graph.
inline const class CorrespondenceGraph& CorrespondenceGraph() const;
// Manually add data to cache.
void AddCamera(class Camera camera);
void AddImage(class Image image);
// Load cameras, images, features, and matches from database.
//
// @param database Source database from which to load data.
// @param min_num_matches Only load image pairs with a minimum number
// of matches.
// @param ignore_watermarks Whether to ignore watermark image pairs.
// @param image_names Whether to use only load the data for a subset
// of the images. All images are used if empty.
void Load(const Database& database, const size_t min_num_matches,
const bool ignore_watermarks,
const std::unordered_set<std::string>& image_names);
// Find specific image by name. Note that this uses linear search.
const class Image* FindImageWithName(const std::string& name) const;
private:
class CorrespondenceGraph correspondence_graph_;
EIGEN_STL_UMAP(camera_t, class Camera) cameras_;
EIGEN_STL_UMAP(image_t, class Image) images_;
};
////////////////////////////////////////////////////////////////////////////////
// Implementation
////////////////////////////////////////////////////////////////////////////////
size_t DatabaseCache::NumCameras() const { return cameras_.size(); }
size_t DatabaseCache::NumImages() const { return images_.size(); }
class Camera& DatabaseCache::Camera(const camera_t camera_id) {
return cameras_.at(camera_id);
}
const class Camera& DatabaseCache::Camera(const camera_t camera_id) const {
return cameras_.at(camera_id);
}
class Image& DatabaseCache::Image(const image_t image_id) {
return images_.at(image_id);
}
const class Image& DatabaseCache::Image(const image_t image_id) const {
return images_.at(image_id);
}
const EIGEN_STL_UMAP(camera_t, class Camera) & DatabaseCache::Cameras() const {
return cameras_;
}
const EIGEN_STL_UMAP(image_t, class Image) & DatabaseCache::Images() const {
return images_;
}
bool DatabaseCache::ExistsCamera(const camera_t camera_id) const {
return cameras_.find(camera_id) != cameras_.end();
}
bool DatabaseCache::ExistsImage(const image_t image_id) const {
return images_.find(image_id) != images_.end();
}
inline const class CorrespondenceGraph& DatabaseCache::CorrespondenceGraph()
const {
return correspondence_graph_;
}
} // namespace colmap
#endif // COLMAP_SRC_BASE_DATABASE_CACHE_H_
|