def shot_lla_and_compass( shot: pymap.Shot, reference: types.TopocentricConverter ) -> Tuple[float, float, float, float]: """Lat, lon, alt and compass of the reconstructed shot position.""" topo = shot.pose.get_origin() lat, lon, alt = reference.to_lla(*topo) dz = shot.pose.get_R_cam_to_world()[:, 2] angle = np.rad2deg(np.arctan2(dz[0], dz[1])) angle = (angle + 360) % 360 return lat, lon, alt, angle
def exif_to_metadata( exif: Dict[str, Any], use_altitude: bool, reference: types.TopocentricConverter ) -> pymap.ShotMeasurements: """Construct a metadata object from raw EXIF tags (as a dict).""" metadata = pymap.ShotMeasurements() gps = exif.get("gps") if gps and "latitude" in gps and "longitude" in gps: lat, lon = gps["latitude"], gps["longitude"] if use_altitude: alt = min([oexif.maximum_altitude, gps.get("altitude", 2.0)]) else: alt = 2.0 # Arbitrary value used to align the reconstruction x, y, z = reference.to_topocentric(lat, lon, alt) metadata.gps_position.value = np.array([x, y, z]) metadata.gps_accuracy.value = gps.get("dop", 15.0) if metadata.gps_accuracy.value == 0.0: metadata.gps_accuracy.value = 15.0 else: metadata.gps_position.value = np.array([0.0, 0.0, 0.0]) metadata.gps_accuracy.value = 999999.0 opk = exif.get("opk") if opk and "omega" in opk and "phi" in opk and "kappa" in opk: omega, phi, kappa = opk["omega"], opk["phi"], opk["kappa"] metadata.opk_angles.value = np.array([omega, phi, kappa]) metadata.opk_accuracy.value = opk.get("accuracy", 1.0) metadata.orientation.value = exif.get("orientation", 1) if "accelerometer" in exif: metadata.accelerometer.value = exif["accelerometer"] if "compass" in exif: metadata.compass_angle.value = exif["compass"]["angle"] if "accuracy" in exif["compass"]: metadata.compass_accuracy.value = exif["compass"]["accuracy"] if "capture_time" in exif: metadata.capture_time.value = exif["capture_time"] if "skey" in exif: metadata.sequence_key.value = exif["skey"] return metadata
def add_gcp_to_bundle( ba: orec.pybundle.BundleAdjuster, reference: types.TopocentricConverter, gcp: List[pymap.GroundControlPoint], gcp_std, shots, ): """Add Ground Control Points constraints to the bundle problem.""" for point in gcp: point_id = "gcp-" + point.id coordinates = multiview.triangulate_gcp( point, shots, reproj_threshold=1, min_ray_angle_degrees=0.1, ) if coordinates is None: if point.lla: enu = reference.to_topocentric(*point.lla_vec) logger.warning( f"Could not triangulate GCP '{point.id}'." f"Using {enu} (derived from lat,lon)" ) coordinates = enu else: logger.warning( "Cannot initialize GCP '{}'." " Ignoring it".format(point.id) ) continue ba.add_point(point_id, coordinates, False) for observation in point.observations: if observation.shot_id in shots: ba.add_point_projection_observation( observation.shot_id, point_id, observation.projection, gcp_std, )
def exif_to_metadata( exif: Dict[str, Any], use_altitude: bool, reference: types.TopocentricConverter) -> pymap.ShotMeasurements: """Construct a metadata object from raw EXIF tags (as a dict).""" metadata = pymap.ShotMeasurements() if "gps" in exif and "latitude" in exif["gps"] and "longitude" in exif[ "gps"]: lat = exif["gps"]["latitude"] lon = exif["gps"]["longitude"] if use_altitude: alt = min( [oexif.maximum_altitude, exif["gps"].get("altitude", 2.0)]) else: alt = 2.0 # Arbitrary value used to align the reconstruction x, y, z = reference.to_topocentric(lat, lon, alt) metadata.gps_position.value = [x, y, z] metadata.gps_accuracy.value = exif["gps"].get("dop", 15.0) if metadata.gps_accuracy.value == 0.0: metadata.gps_accuracy.value = 15.0 else: metadata.gps_position.value = [0.0, 0.0, 0.0] metadata.gps_accuracy.value = 999999.0 metadata.orientation.value = exif.get("orientation", 1) if "accelerometer" in exif: metadata.accelerometer.value = exif["accelerometer"] if "compass" in exif: metadata.compass_angle.value = exif["compass"]["angle"] if "accuracy" in exif["compass"]: metadata.compass_accuracy.value = exif["compass"]["accuracy"] if "capture_time" in exif: metadata.capture_time.value = exif["capture_time"] if "skey" in exif: metadata.sequence_key.value = exif["skey"] return metadata