@@ -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