34 #include <unordered_set>
46 cameras_.emplace(camera.
CameraId(), camera);
56 const bool ignore_watermarks,
57 const std::unordered_set<std::string>& image_names) {
65 std::cout <<
"Loading cameras..." << std::flush;
68 const std::vector<class Camera> cameras = database.
ReadAllCameras();
69 cameras_.reserve(cameras.size());
70 for (
const auto& camera : cameras) {
71 cameras_.emplace(camera.CameraId(), camera);
75 std::cout <<
StringPrintf(
" %d in %.3fs", cameras_.size(),
84 std::cout <<
"Loading matches..." << std::flush;
86 std::vector<image_pair_t> image_pair_ids;
87 std::vector<TwoViewGeometry> two_view_geometries;
90 std::cout <<
StringPrintf(
" %d in %.3fs", image_pair_ids.size(),
94 auto UseInlierMatchesCheck = [min_num_matches, ignore_watermarks](
96 return static_cast<size_t>(two_view_geometry.inlier_matches.size()) >=
98 (!ignore_watermarks ||
107 std::cout <<
"Loading images..." << std::flush;
109 std::unordered_set<image_t> image_ids;
112 const std::vector<class Image> images = database.
ReadAllImages();
115 if (image_names.empty()) {
116 for (
const auto&
image : images) {
117 image_ids.insert(
image.ImageId());
120 for (
const auto&
image : images) {
121 if (image_names.count(
image.Name()) > 0) {
122 image_ids.insert(
image.ImageId());
128 std::unordered_set<image_t> connected_image_ids;
129 connected_image_ids.reserve(image_ids.size());
130 for (
size_t i = 0; i < image_pair_ids.size(); ++i) {
131 if (UseInlierMatchesCheck(two_view_geometries[i])) {
135 if (image_ids.count(image_id1) > 0 && image_ids.count(image_id2) > 0) {
136 connected_image_ids.insert(image_id1);
137 connected_image_ids.insert(image_id2);
144 images_.reserve(connected_image_ids.size());
145 for (
const auto&
image : images) {
146 if (image_ids.count(
image.ImageId()) > 0 &&
147 connected_image_ids.count(
image.ImageId()) > 0) {
151 const std::vector<Eigen::Vector2d>
points =
157 std::cout <<
StringPrintf(
" %d in %.3fs (connected %d)", images.size(),
159 connected_image_ids.size())
168 std::cout <<
"Building correspondence graph..." << std::flush;
170 for (
const auto&
image : images_) {
174 size_t num_ignored_image_pairs = 0;
175 for (
size_t i = 0; i < image_pair_ids.size(); ++i) {
176 if (UseInlierMatchesCheck(two_view_geometries[i])) {
180 if (image_ids.count(image_id1) > 0 && image_ids.count(image_id2) > 0) {
182 image_id1, image_id2, two_view_geometries[i].inlier_matches);
184 num_ignored_image_pairs += 1;
187 num_ignored_image_pairs += 1;
194 for (
auto&
image : images_) {
195 image.second.SetNumObservations(
197 image.second.SetNumCorrespondences(
202 num_ignored_image_pairs)
207 const std::string&
name)
const {
208 for (
const auto&
image : images_) {
210 return &
image.second;
std::shared_ptr< core::Tensor > image
camera_t CameraId() const
void AddImage(const image_t image_id, const size_t num_points2D)
point2D_t NumCorrespondencesForImage(const image_t image_id) const
void AddCorrespondences(const image_t image_id1, const image_t image_id2, const FeatureMatches &matches)
point2D_t NumObservationsForImage(const image_t image_id) const
bool ExistsCamera(const camera_t camera_id) const
void AddImage(const class Image &image)
void Load(const Database &database, const size_t min_num_matches, const bool ignore_watermarks, const std::unordered_set< std::string > &image_names)
const class Image * FindImageWithName(const std::string &name) const
void AddCamera(const class Camera &camera)
bool ExistsImage(const image_t image_id) const
FeatureKeypoints ReadKeypoints(const image_t image_id) const
std::vector< Camera > ReadAllCameras() const
void ReadTwoViewGeometries(std::vector< image_pair_t > *image_pair_ids, std::vector< TwoViewGeometry > *two_view_geometries) const
static void PairIdToImagePair(const image_pair_t pair_id, image_t *image_id1, image_t *image_id2)
std::vector< Image > ReadAllImages() const
double ElapsedSeconds() const
QTextStream & endl(QTextStream &stream)
std::vector< Eigen::Vector2d > FeatureKeypointsToPointsVector(const FeatureKeypoints &keypoints)
std::vector< FeatureKeypoint > FeatureKeypoints
std::string StringPrintf(const char *format,...)