def bootstrap_reconstruction(data, graph, im1, im2): '''Starts a reconstruction using two shots. ''' print 'Initial reconstruction with', im1, 'and', im2 d1 = data.load_exif(im1) d2 = data.load_exif(im2) cameras = data.load_camera_models() camera1 = cameras[d1['camera']] camera2 = cameras[d2['camera']] tracks, p1, p2 = matching.common_tracks(graph, im1, im2) print 'Number of common tracks', len(tracks) threshold = data.config.get('five_point_algo_threshold', 0.006) R, t, inliers = two_view_reconstruction(p1, p2, camera1, camera2, threshold) if len(inliers) > 5: print 'Number of inliers', len(inliers) reconstruction = types.Reconstruction() reconstruction.cameras = cameras shot1 = types.Shot() shot1.id = im1 shot1.camera = cameras[str(d1['camera'])] shot1.pose = types.Pose() shot1.metadata = get_image_metadata(data, im1) reconstruction.add_shot(shot1) shot2 = types.Shot() shot2.id = im2 shot2.camera = cameras[str(d2['camera'])] shot2.pose = types.Pose() shot2.pose.rotation = R shot2.pose.translation = t shot2.metadata = get_image_metadata(data, im2) reconstruction.add_shot(shot2) triangulate_shot_features( graph, reconstruction, im1, data.config.get('triangulation_threshold', 0.004), data.config.get('triangulation_min_ray_angle', 2.0)) print 'Number of reconstructed 3D points :{}'.format(len(reconstruction.points)) if len(reconstruction.points) > data.config.get('five_point_algo_min_inliers', 50): print 'Found initialize good pair', im1 , 'and', im2 bundle_single_view(graph, reconstruction, im2, data.config) retriangulate(graph, reconstruction, data.config) bundle_single_view(graph, reconstruction, im2, data.config) return reconstruction print 'Pair', im1, ':', im2, 'fails' return None
def compute_image_pairs(graph, image_graph, config): '''All matched image pairs sorted by reconstructability. ''' pairs = [] score = [] for im1, im2, d in image_graph.edges(data=True): tracks, p1, p2 = matching.common_tracks(graph, im1, im2) if len(tracks) >= 50: H, inliers = cv2.findHomography(p1, p2, cv2.RANSAC, config.get('homography_threshold', 0.004)) r = pairwise_reconstructability(len(tracks), inliers.sum()) if r > 0: pairs.append((im1,im2)) score.append(r) order = np.argsort(-np.array(score)) return [pairs[o] for o in order]