Skip to content

Commit 8f97faa

Browse files
committed
d
1 parent 0ab5f85 commit 8f97faa

File tree

1 file changed

+40
-42
lines changed

1 file changed

+40
-42
lines changed

glomap/controllers/rotation_averager.cc

Lines changed: 40 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,14 @@ bool SolveRotationAveraging(ViewGraph& view_graph,
1616

1717
ViewGraph view_graph_grav;
1818
image_pair_t total_pairs = 0;
19-
image_pair_t grav_pairs = 0;
2019
if (solve_1dof_system) {
2120
// Prepare two sets: ones all with gravity, and one does not have gravity.
2221
// Solve them separately first, then solve them in a single system
2322
for (const auto& [pair_id, image_pair] : view_graph.image_pairs) {
2423
if (!image_pair.is_valid) continue;
2524

26-
image_t image_id1 = image_pair.image_id1;
27-
image_t image_id2 = image_pair.image_id2;
28-
29-
Image& image1 = images[image_id1];
30-
Image& image2 = images[image_id2];
25+
const Image& image1 = images[image_pair.image_id1];
26+
const Image& image2 = images[image_pair.image_id2];
3127

3228
if (!image1.IsRegistered() || !image2.IsRegistered()) continue;
3329

@@ -36,16 +32,22 @@ bool SolveRotationAveraging(ViewGraph& view_graph,
3632
if (image1.HasGravity() && image2.HasGravity()) {
3733
view_graph_grav.image_pairs.emplace(
3834
pair_id,
39-
ImagePair(image_id1, image_id2, image_pair.cam2_from_cam1));
40-
grav_pairs++;
35+
ImagePair(image_pair.image_id1,
36+
image_pair.image_id2,
37+
image_pair.cam2_from_cam1));
4138
}
4239
}
4340
}
4441

42+
const size_t grav_pairs = view_graph_grav.image_pairs.size();
43+
44+
LOG(INFO) << "Total image pairs: " << total_pairs
45+
<< ", gravity image pairs: " << grav_pairs;
46+
4547
// If there is no image pairs with gravity or most image pairs are with
4648
// gravity, then just run the 3dof version
47-
const bool status = (grav_pairs == 0) || (grav_pairs > total_pairs * 0.95);
48-
solve_1dof_system = solve_1dof_system && (!status);
49+
const bool status = grav_pairs == 0 || grav_pairs > total_pairs * 0.95;
50+
solve_1dof_system = solve_1dof_system && !status;
4951

5052
if (solve_1dof_system) {
5153
// Run the 1dof optimization
@@ -61,31 +63,30 @@ bool SolveRotationAveraging(ViewGraph& view_graph,
6163
view_graph.KeepLargestConnectedComponents(frames, images);
6264
}
6365

64-
// By default, run trivial rotation averaging for rigged cameras if some
65-
// cam_from_rig are not estimated Check if there are rigs with non-trivial
66-
// cam_from_rig
67-
std::unordered_set<camera_t> camera_without_rig;
66+
// By default, run trivial rotation averaging for cameras with unknown
67+
// cam_from_rig.
68+
std::unordered_set<camera_t> unknown_cams_from_rig;
6869
rig_t max_rig_id = 0;
6970
for (const auto& [rig_id, rig] : rigs) {
7071
max_rig_id = std::max(max_rig_id, rig_id);
7172
for (const auto& [sensor_id, sensor] : rig.NonRefSensors()) {
7273
if (sensor_id.type != SensorType::CAMERA) continue;
7374
if (!rig.MaybeSensorFromRig(sensor_id).has_value()) {
74-
camera_without_rig.insert(sensor_id.id);
75+
unknown_cams_from_rig.insert(sensor_id.id);
7576
}
7677
}
7778
}
7879

7980
bool status_ra = false;
8081
// If the trivial rotation averaging is enabled, run it
81-
if (camera_without_rig.size() > 0 && !options.skip_initialization) {
82+
if (!unknown_cams_from_rig.empty() && !options.skip_initialization) {
8283
LOG(INFO) << "Running trivial rotation averaging for rigged cameras";
8384
// Create a rig for each camera
8485
std::unordered_map<rig_t, Rig> rigs_trivial;
8586
std::unordered_map<frame_t, Frame> frames_trivial;
8687
std::unordered_map<image_t, Image> images_trivial;
8788

88-
// For cameras without rigs, create a trivial rig
89+
// For cameras with known cam_from_rig, create rigs with only those sensors.
8990
std::unordered_map<camera_t, rig_t> camera_id_to_rig_id;
9091
for (const auto& [rig_id, rig] : rigs) {
9192
Rig rig_trivial;
@@ -103,8 +104,8 @@ bool SolveRotationAveraging(ViewGraph& view_graph,
103104
rigs_trivial[rig_trivial.RigId()] = rig_trivial;
104105
}
105106

106-
// Then, for each camera without rig, create a trivial rig
107-
for (const auto& camera_id : camera_without_rig) {
107+
// For each camera with unknown cam_from_rig, create a separate trivial rig.
108+
for (const auto& camera_id : unknown_cams_from_rig) {
108109
Rig rig_trivial;
109110
rig_trivial.SetRigId(++max_rig_id);
110111
rig_trivial.AddRefSensor(sensor_t(SensorType::CAMERA, camera_id));
@@ -113,8 +114,8 @@ bool SolveRotationAveraging(ViewGraph& view_graph,
113114
}
114115

115116
frame_t max_frame_id = 0;
116-
for (const auto& [frame_id, frame] : frames) {
117-
if (frame_id == colmap::kInvalidFrameId) continue;
117+
for (const auto& [frame_id, _] : frames) {
118+
THROW_CHECK_NE(frame_id, colmap::kInvalidFrameId);
118119
max_frame_id = std::max(max_frame_id, frame_id);
119120
}
120121
max_frame_id++;
@@ -129,26 +130,25 @@ bool SolveRotationAveraging(ViewGraph& view_graph,
129130
: nullptr);
130131
frames_trivial[frame_id] = frame_trivial;
131132

132-
for (const auto& data_id : frame.DataIds()) {
133-
image_t image_id = data_id.id;
134-
if (images.find(image_id) == images.end()) continue;
135-
const auto& image = images.at(image_id);
133+
for (const auto& data_id : frame.ImageIds()) {
134+
const auto& image = images.at(data_id.id);
136135
if (!image.IsRegistered()) continue;
137-
images_trivial.insert(std::make_pair(
138-
image_id, Image(image_id, image.camera_id, image.file_name)));
139-
140-
if (camera_without_rig.find(images_trivial[image_id].camera_id) ==
141-
camera_without_rig.end()) {
142-
// images_trivial_to_frame_id[image_id] = frame_id;
143-
144-
frames_trivial[frame_id].AddDataId(images_trivial[image_id].DataId());
145-
images_trivial[image_id].frame_id = frame_id;
146-
images_trivial[image_id].frame_ptr = &frames_trivial[frame_id];
136+
auto& image_trivial =
137+
images_trivial
138+
.emplace(data_id.id,
139+
Image(data_id.id, image.camera_id, image.file_name))
140+
.first->second;
141+
142+
if (unknown_cams_from_rig.find(image_trivial.camera_id) ==
143+
unknown_cams_from_rig.end()) {
144+
frames_trivial[frame_id].AddDataId(image_trivial.DataId());
145+
image_trivial.frame_id = frame_id;
146+
image_trivial.frame_ptr = &frames_trivial[frame_id];
147147
} else {
148148
// If the camera is not in any rig, then create a trivial frame
149149
// for it
150150
CreateFrameForImage(Rigid3d(),
151-
images_trivial[image_id],
151+
image_trivial,
152152
rigs_trivial,
153153
frames_trivial,
154154
camera_id_to_rig_id[image.camera_id],
@@ -167,13 +167,13 @@ bool SolveRotationAveraging(ViewGraph& view_graph,
167167
view_graph, rigs_trivial, frames_trivial, images_trivial);
168168

169169
// Collect the results
170-
std::unordered_map<image_t, Rigid3d> cam_from_worlds;
170+
std::unordered_map<image_t, Rigid3d> cams_from_world;
171171
for (const auto& [image_id, image] : images_trivial) {
172172
if (!image.IsRegistered()) continue;
173-
cam_from_worlds[image_id] = image.CamFromWorld();
173+
cams_from_world[image_id] = image.CamFromWorld();
174174
}
175175

176-
ConvertRotationsFromImageToRig(cam_from_worlds, images, rigs, frames);
176+
ConvertRotationsFromImageToRig(cams_from_world, images, rigs, frames);
177177

178178
RotationEstimatorOptions options_ra = options;
179179
options_ra.skip_initialization = true;
@@ -186,9 +186,7 @@ bool SolveRotationAveraging(ViewGraph& view_graph,
186186
// For cases where there are some cameras without known cam_from_rig
187187
// transformation, we need to run the rotation averaging with the
188188
// skip_initialization flag set to false for convergence
189-
if (camera_without_rig.size() > 0) {
190-
options_ra.skip_initialization = false;
191-
}
189+
options_ra.skip_initialization = unknown_cams_from_rig.empty();
192190

193191
RotationEstimator rotation_estimator(options_ra);
194192
status_ra =

0 commit comments

Comments
 (0)