Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion glomap/estimators/global_rotation_averaging.cc
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ void RotationEstimator::InitializeFromMaximumSpanningTree(

// Directly use the relative pose for estimation rotation
const ImagePair& image_pair = view_graph.image_pairs.at(
ImagePair::ImagePairToPairId(curr, parents[curr]));
colmap::ImagePairToPairId(curr, parents[curr]));
if (image_pair.image_id1 == curr) {
// 1_R_w = 2_R_1^T * 2_R_w
cam_from_worlds[curr].rotation =
Expand Down
35 changes: 16 additions & 19 deletions glomap/estimators/gravity_refinement.cc
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,10 @@ namespace glomap {
void GravityRefiner::RefineGravity(const ViewGraph& view_graph,
std::unordered_map<frame_t, Frame>& frames,
std::unordered_map<image_t, Image>& images) {
const std::unordered_map<image_pair_t, ImagePair>& image_pairs =
view_graph.image_pairs;
const std::unordered_map<image_t, std::unordered_set<image_t>>&
adjacency_list = view_graph.GetAdjacencyList();
adjacency_list = view_graph.CreateImageAdjacencyList();
if (adjacency_list.empty()) {
LOG(INFO) << "Adjacency list not established" << std::endl;
LOG(INFO) << "Adjacency list not established";
return;
}

Expand All @@ -24,16 +22,16 @@ void GravityRefiner::RefineGravity(const ViewGraph& view_graph,
IdentifyErrorProneGravity(view_graph, frames, images, error_prone_frames);

if (error_prone_frames.empty()) {
LOG(INFO) << "No error prone frames found" << std::endl;
LOG(INFO) << "No error prone frames found";
return;
}
// Get the relevant pair ids for frames
std::unordered_map<frame_t, std::unordered_set<image_pair_t>>
adjacency_list_frames_to_pair_id;
for (auto& [image_id, neighbors] : adjacency_list) {
for (auto neighbor : neighbors) {
for (const auto& neighbor : neighbors) {
adjacency_list_frames_to_pair_id[images[image_id].frame_id].insert(
ImagePair::ImagePairToPairId(image_id, neighbor));
colmap::ImagePairToPairId(image_id, neighbor));
}
}

Expand All @@ -59,8 +57,8 @@ void GravityRefiner::RefineGravity(const ViewGraph& view_graph,
int counter = 0;
Eigen::Vector3d gravity = frames[frame_id].gravity_info.GetGravity();
for (const auto& pair_id : neighbors) {
image_t image_id1 = image_pairs.at(pair_id).image_id1;
image_t image_id2 = image_pairs.at(pair_id).image_id2;
const image_t image_id1 = view_graph.image_pairs.at(pair_id).image_id1;
const image_t image_id2 = view_graph.image_pairs.at(pair_id).image_id2;
if (!images.at(image_id1).HasGravity() ||
!images.at(image_id2).HasGravity())
continue;
Expand All @@ -82,17 +80,18 @@ void GravityRefiner::RefineGravity(const ViewGraph& view_graph,
// consider a single cost term
if (images.at(image_id1).frame_id == frame_id) {
gravities.emplace_back(
(colmap::Inverse(image_pairs.at(pair_id).cam2_from_cam1 *
(colmap::Inverse(view_graph.image_pairs.at(pair_id).cam2_from_cam1 *
cam1_from_rig1)
.rotation.toRotationMatrix() *
images[image_id2].GetRAlign())
.col(1));
} else if (images.at(image_id2).frame_id == frame_id) {
gravities.emplace_back(((colmap::Inverse(cam2_from_rig2) *
image_pairs.at(pair_id).cam2_from_cam1)
.rotation.toRotationMatrix() *
images[image_id1].GetRAlign())
.col(1));
gravities.emplace_back(
((colmap::Inverse(cam2_from_rig2) *
view_graph.image_pairs.at(pair_id).cam2_from_cam1)
.rotation.toRotationMatrix() *
images[image_id1].GetRAlign())
.col(1));
}

ceres::CostFunction* coor_cost =
Expand Down Expand Up @@ -123,9 +122,8 @@ void GravityRefiner::RefineGravity(const ViewGraph& view_graph,
frames[frame_id].gravity_info.SetGravity(gravity);
}
}
std::cout << std::endl;
LOG(INFO) << "Number of rectified frames: " << counter_rect << " / "
<< error_prone_frames.size() << std::endl;
<< error_prone_frames.size();
}

void GravityRefiner::IdentifyErrorProneGravity(
Expand Down Expand Up @@ -179,7 +177,6 @@ void GravityRefiner::IdentifyErrorProneGravity(
error_prone_frames.insert(frame_id);
}
}
LOG(INFO) << "Number of error prone frames: " << error_prone_frames.size()
<< std::endl;
LOG(INFO) << "Number of error prone frames: " << error_prone_frames.size();
}
} // namespace glomap
4 changes: 1 addition & 3 deletions glomap/io/colmap_converter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -361,7 +361,7 @@ void ConvertDatabaseToGlomap(const colmap::Database& database,

// Initialize the image pair
auto ite = image_pairs.insert(
std::make_pair(ImagePair::ImagePairToPairId(image_id1, image_id2),
std::make_pair(colmap::ImagePairToPairId(image_id1, image_id2),
ImagePair(image_id1, image_id2)));
ImagePair& image_pair = ite.first->second;

Expand Down Expand Up @@ -419,8 +419,6 @@ void ConvertDatabaseToGlomap(const colmap::Database& database,
}
image_pair.matches.conservativeResize(count, 2);
}
std::cout << std::endl;

LOG(INFO) << "Pairs read done. " << invalid_count << " / "
<< view_graph.image_pairs.size() << " are invalid";
}
Expand Down
20 changes: 10 additions & 10 deletions glomap/io/pose_io.cc
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ void ReadRelPose(const std::string& file_path,
image_t index1 = name_idx[file1];
image_t index2 = name_idx[file2];

image_pair_t pair_id = ImagePair::ImagePairToPairId(index1, index2);
const image_pair_t pair_id = colmap::ImagePairToPairId(index1, index2);

// rotation
Rigid3d pose_rel;
Expand All @@ -81,7 +81,7 @@ void ReadRelPose(const std::string& file_path,
}
counter++;
}
LOG(INFO) << counter << " relpose are loaded" << std::endl;
LOG(INFO) << counter << " relative poses are loaded";
}

void ReadRelWeight(const std::string& file_path,
Expand Down Expand Up @@ -118,7 +118,7 @@ void ReadRelWeight(const std::string& file_path,
image_t index1 = name_idx[file1];
image_t index2 = name_idx[file2];

image_pair_t pair_id = ImagePair::ImagePairToPairId(index1, index2);
image_pair_t pair_id = colmap::ImagePairToPairId(index1, index2);

if (view_graph.image_pairs.find(pair_id) == view_graph.image_pairs.end())
continue;
Expand All @@ -127,7 +127,7 @@ void ReadRelWeight(const std::string& file_path,
view_graph.image_pairs[pair_id].weight = std::stod(item);
counter++;
}
LOG(INFO) << counter << " weights are used are loaded" << std::endl;
LOG(INFO) << counter << " weights are used are loaded";
}

// TODO: now, we only store 1 single gravity per rig.
Expand Down Expand Up @@ -172,7 +172,7 @@ void ReadGravity(const std::string& gravity_path,
}
}
}
LOG(INFO) << counter << " images are loaded with gravity" << std::endl;
LOG(INFO) << counter << " images are loaded with gravity";
}

void WriteGlobalRotation(const std::string& file_path,
Expand All @@ -185,7 +185,7 @@ void WriteGlobalRotation(const std::string& file_path,
}
}
for (const auto& image_id : existing_images) {
const auto image = images.at(image_id);
const auto& image = images.at(image_id);
if (!image.IsRegistered()) continue;
file << image.file_name;
Rigid3d cam_from_world = image.CamFromWorld();
Expand All @@ -205,8 +205,8 @@ void WriteRelPose(const std::string& file_path,
std::map<std::string, image_pair_t> name_pair;
for (const auto& [pair_id, image_pair] : view_graph.image_pairs) {
if (image_pair.is_valid) {
const auto image1 = images.at(image_pair.image_id1);
const auto image2 = images.at(image_pair.image_id2);
const auto& image1 = images.at(image_pair.image_id1);
const auto& image2 = images.at(image_pair.image_id2);
name_pair[image1.file_name + " " + image2.file_name] = pair_id;
}
}
Expand All @@ -226,6 +226,6 @@ void WriteRelPose(const std::string& file_path,
file << "\n";
}

LOG(INFO) << name_pair.size() << " relpose are written" << std::endl;
LOG(INFO) << name_pair.size() << " relpose are written";
}
} // namespace glomap
} // namespace glomap
2 changes: 1 addition & 1 deletion glomap/processors/image_pair_inliers.cc
Original file line number Diff line number Diff line change
Expand Up @@ -212,4 +212,4 @@ void ImagePairsInlierCount(ViewGraph& view_graph,
}
}

} // namespace glomap
} // namespace glomap
18 changes: 8 additions & 10 deletions glomap/processors/reconstruction_pruning.cc
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ image_t PruneWeaklyConnectedImages(std::unordered_map<frame_t, Frame>& frames,
image_t image_id2 = track.observations[j].first;
frame_t frame_id2 = images[image_id2].frame_id;
if (frame_id1 == frame_id2) continue;
image_pair_t pair_id =
ImagePair::ImagePairToPairId(frame_id1, frame_id2);
const image_pair_t pair_id =
colmap::ImagePairToPairId(frame_id1, frame_id2);
if (pair_covisibility_count.find(pair_id) ==
pair_covisibility_count.end()) {
pair_covisibility_count[pair_id] = 1;
Expand All @@ -44,8 +44,7 @@ image_t PruneWeaklyConnectedImages(std::unordered_map<frame_t, Frame>& frames,
// then require each pair to have at least 5 points
if (count >= 5) {
counter++;
image_t image_id1, image_id2;
ImagePair::PairIdToImagePair(pair_id, image_id1, image_id2);
const auto [image_id1, image_id2] = colmap::PairIdToImagePair(pair_id);

if (frame_observation_count[image_id1] < min_num_observations ||
frame_observation_count[image_id2] < min_num_observations)
Expand Down Expand Up @@ -76,10 +75,9 @@ image_t PruneWeaklyConnectedImages(std::unordered_map<frame_t, Frame>& frames,

ViewGraph visibility_graph;
for (auto& [pair_id, image_pair] : visibility_graph_frame.image_pairs) {
frame_t frame_id1, frame_id2;
ImagePair::PairIdToImagePair(pair_id, frame_id1, frame_id2);
image_t image_id1 = frame_id_to_begin_img[frame_id1];
image_t image_id2 = frame_id_to_begin_img[frame_id2];
const auto [frame_id1, frame_id2] = colmap::PairIdToImagePair(pair_id);
const image_t image_id1 = frame_id_to_begin_img[frame_id1];
const image_t image_id2 = frame_id_to_begin_img[frame_id2];
visibility_graph.image_pairs.insert(
std::make_pair(pair_id, ImagePair(image_id1, image_id2)));
visibility_graph.image_pairs[pair_id].weight = image_pair.weight;
Expand All @@ -96,7 +94,7 @@ image_t PruneWeaklyConnectedImages(std::unordered_map<frame_t, Frame>& frames,
if (image_id == begin_image_id || images.find(image_id) == images.end())
continue;
image_pair_t pair_id =
ImagePair::ImagePairToPairId(begin_image_id, image_id);
colmap::ImagePairToPairId(begin_image_id, image_id);
visibility_graph.image_pairs.insert(
std::make_pair(pair_id, ImagePair(begin_image_id, image_id)));

Expand Down Expand Up @@ -132,4 +130,4 @@ image_t PruneWeaklyConnectedImages(std::unordered_map<frame_t, Frame>& frames,
// return visibility_graph.MarkConnectedComponents(images, min_num_images);
}

} // namespace glomap
} // namespace glomap
2 changes: 1 addition & 1 deletion glomap/processors/relpose_filter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -64,4 +64,4 @@ void RelPoseFilter::FilterInlierRatio(ViewGraph& view_graph,
<< " relative poses with inlier ratio < " << min_inlier_ratio;
}

} // namespace glomap
} // namespace glomap
7 changes: 3 additions & 4 deletions glomap/processors/view_graph_manipulation.cc
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ image_pair_t ViewGraphManipulater::SparsifyGraph(
// Keep track of chosen edges
std::unordered_set<image_pair_t> chosen_edges;
const std::unordered_map<image_t, std::unordered_set<image_t>>&
adjacency_list = view_graph.GetAdjacencyList();
adjacency_list = view_graph.CreateImageAdjacencyList();

// Here, the average is the mean of the degrees
double average_degree = 0;
Expand Down Expand Up @@ -47,6 +47,7 @@ image_pair_t ViewGraphManipulater::SparsifyGraph(
continue;
}

// TODO: Replace rand() with thread-safe random number generator.
if (rand() / double(RAND_MAX) <
(expected_degree * average_degree) / (degree1 * degree2)) {
chosen_edges.insert(pair_id);
Expand Down Expand Up @@ -208,9 +209,7 @@ void ViewGraphManipulater::UpdateImagePairsConfig(
// pairs are valid, then set the camera to valid
std::unordered_map<camera_t, bool> camera_validity;
for (auto& [camera_id, counter] : camera_counter) {
if (counter.first == 0) {
camera_validity[camera_id] = false;
} else if (counter.second * 1. / counter.first > 0.5) {
if (counter.second * 1. / counter.first > 0.5) {
camera_validity[camera_id] = true;
} else {
camera_validity[camera_id] = false;
Expand Down
44 changes: 14 additions & 30 deletions glomap/scene/image_pair.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,24 @@

namespace glomap {

// FUTURE: add covariance to the relative pose
// TODO: add covariance to the relative pose
struct ImagePair {
ImagePair() : pair_id(-1), image_id1(-1), image_id2(-1) {}
ImagePair(image_t img_id1, image_t img_id2, Rigid3d pose_rel = Rigid3d())
: pair_id(ImagePairToPairId(img_id1, img_id2)),
image_id1(img_id1),
image_id2(img_id2),
cam2_from_cam1(pose_rel) {}
ImagePair()
: image_id1(colmap::kInvalidImageId),
image_id2(colmap::kInvalidImageId),
pair_id(colmap::kInvalidImagePairId) {}
ImagePair(image_t image_id1,
image_t image_id2,
Rigid3d cam2_from_cam1 = Rigid3d())
: image_id1(image_id1),
image_id2(image_id2),
pair_id(colmap::ImagePairToPairId(image_id1, image_id2)),
cam2_from_cam1(cam2_from_cam1) {}

// Ids are kept constant
const image_pair_t pair_id;
const image_t image_id1;
const image_t image_id2;
const image_pair_t pair_id;

// indicator whether the image pair is valid
bool is_valid = true;
Expand All @@ -40,7 +45,7 @@ struct ImagePair {
Eigen::Matrix3d H = Eigen::Matrix3d::Zero();

// Relative pose.
Rigid3d cam2_from_cam1;
Rigid3d cam2_from_cam1 = Rigid3d();

// Matches between the two images.
// First column is the index of the feature in the first image.
Expand All @@ -49,27 +54,6 @@ struct ImagePair {

// Row index of inliers in the matches matrix.
std::vector<int> inliers;

static inline image_pair_t ImagePairToPairId(const image_t image_id1,
const image_t image_id2);

static inline void PairIdToImagePair(const image_pair_t pair_id,
image_t& image_id1,
image_t& image_id2);
};

image_pair_t ImagePair::ImagePairToPairId(const image_t image_id1,
const image_t image_id2) {
return colmap::ImagePairToPairId(image_id1, image_id2);
}

void ImagePair::PairIdToImagePair(const image_pair_t pair_id,
image_t& image_id1,
image_t& image_id2) {
std::pair<image_t, image_t> image_id_pair =
colmap::PairIdToImagePair(pair_id);
image_id1 = image_id_pair.first;
image_id2 = image_id_pair.second;
}

} // namespace glomap
Loading
Loading