def _transform(self, point, reference, projection): """Transform on point from local coords to a proj4 projection.""" lat, lon, altitude = geo.lla_from_topocentric( point[0], point[1], point[2], reference['latitude'], reference['longitude'], reference['altitude']) easting, northing = projection(lon, lat) return [easting, northing, altitude]
def register_reconstruction_with_gps(reconstruction, reference): """ register reconstrution with gps positions and compass angles """ shots = reconstruction['shots'] for shot_id, shot in shots.iteritems(): gps = {} topo = optical_center(shot) lat, lon, alt = geo.lla_from_topocentric(topo[0], topo[1], topo[2], reference['latitude'], reference['longitude'], reference['altitude']) # find direction shot['translation'][2] -= 1 topo2 = optical_center(shot) dz = topo2 - topo angle = np.rad2deg(np.arctan2(dz[0], dz[1])) angle = (angle + 360) % 360 reconstruction['shots'][shot_id]['gps'] = { 'lon': lon, 'lat': lat, 'altitude': alt, 'direction': angle }
def test_ecef_lla_topocentric_consistency() -> None: lla_ref = [46.5, 6.5, 400] lla_before = [46.5274109, 6.5722075, 402.16] enu = geo.topocentric_from_lla(lla_before[0], lla_before[1], lla_before[2], lla_ref[0], lla_ref[1], lla_ref[2]) lla_after = geo.lla_from_topocentric(enu[0], enu[1], enu[2], lla_ref[0], lla_ref[1], lla_ref[2]) assert np.allclose(lla_after, lla_before)
def _transform(self, point, reference, projection): lat, lon, altitude = geo.lla_from_topocentric(point[0], point[1], point[2], reference['latitude'], reference['longitude'], reference['altitude']) easting, northing = projection(lon, lat) return [easting, northing, altitude]
def _transform(self, point, reference, projection): """Transform on point from local coords to a proj4 projection.""" lat, lon, altitude = geo.lla_from_topocentric(point[0], point[1], point[2], reference['latitude'], reference['longitude'], reference['altitude']) easting, northing = projection(lon, lat) return [easting, northing, altitude]
def shot_lla_and_compass(shot, reference): """Lat, lon, alt and compass of the reconstructed shot position.""" topo = shot.pose.get_origin() lat, lon, alt = geo.lla_from_topocentric( topo[0], topo[1], topo[2], reference['latitude'], reference['longitude'], reference['altitude']) dz = shot.viewing_direction() angle = np.rad2deg(np.arctan2(dz[0], dz[1])) angle = (angle + 360) % 360 return lat, lon, alt, angle
def test_ecef_lla_topocentric_consistency(): lla_ref = [46.5, 6.5, 400] lla_before = [46.5274109, 6.5722075, 402.16] enu = geo.topocentric_from_lla(lla_before[0], lla_before[1], lla_before[2], lla_ref[0], lla_ref[1], lla_ref[2]) lla_after = geo.lla_from_topocentric(enu[0], enu[1], enu[2], lla_ref[0], lla_ref[1], lla_ref[2]) assert np.allclose(lla_after, lla_before)
def generate_exifs(reconstruction, gps_noise, speed_ms=10): """ Return extracted exif information, as dictionary, usually with fields: ================ ===== =================================== Field Type Description ================ ===== =================================== width int Width of image, in pixels height int Height of image, in pixels focal_prior float Focal length (real) / sensor width ================ ===== =================================== :param image: Image name, with extension (i.e. 123.jpg) """ previous_pose = None previous_time = 0 exifs = {} for shot_name in sorted(reconstruction.shots.keys()): shot = reconstruction.shots[shot_name] exif = {} exif['width'] = shot.camera.width exif['height'] = shot.camera.height exif['focal_prior'] = shot.camera.focal_prior exif['camera'] = str(shot.camera.id) pose = shot.pose.get_origin() if previous_pose is not None: previous_time += np.linalg.norm(pose-previous_pose)*speed_ms previous_pose = pose exif['capture_time'] = previous_time perturb_points([pose], [gps_noise, gps_noise, gps_noise]) lat, lon, alt = geo.lla_from_topocentric(pose[0], pose[1], pose[2], 0, 0, 0) exif['gps'] = {} exif['gps']['latitude'] = lat exif['gps']['longitude'] = lon exif['gps']['altitude'] = alt exif['gps']['dop'] = gps_noise exifs[shot_name] = exif return exifs
def register_reconstruction_with_gps(reconstruction, reference): """ register reconstrution with gps positions and compass angles """ shots = reconstruction["shots"] for shot_id, shot in shots.iteritems(): gps = {} topo = optical_center(shot) lat, lon, alt = geo.lla_from_topocentric( topo[0], topo[1], topo[2], reference["latitude"], reference["longitude"], reference["altitude"] ) # find direction shot["translation"][2] -= 1 topo2 = optical_center(shot) dz = topo2 - topo angle = np.rad2deg(np.arctan2(dz[0], dz[1])) angle = (angle + 360) % 360 reconstruction["shots"][shot_id]["gps"] = {"lon": lon, "lat": lat, "altitude": alt, "direction": angle}
def register_reconstruction_with_gps(reconstruction, reference): """ register reconstrution with gps positions and compass angles """ shots = reconstruction['shots'] for shot_id, shot in shots.iteritems(): gps = {} topo = optical_center(shot) lat, lon, alt = geo.lla_from_topocentric(topo[0], topo[1], topo[2], reference['latitude'], reference['longitude'], reference['altitude']) # find direction shot['translation'][2] -= 1 topo2 = optical_center(shot) dz = topo2 - topo angle = np.rad2deg(np.arctan2(dz[0], dz[1])) angle = (angle+360) % 360 reconstruction['shots'][shot_id]['gps'] = { 'lon': lon, 'lat': lat, 'altitude': alt, 'direction': angle }
default=3, type=int, help='number of points to generate') args = parser.parse_args() data = dataset.DataSet(args.dataset) reference = data.load_reference_lla() reconstruction = data.load_reconstruction()[0] print 'WGS84' for i in range(args.num_points): point = np.random.choice(reconstruction.points.values()) for shot in reconstruction.shots.values(): pixel = shot.project(point.coordinates) if np.fabs(pixel).max() < 0.5: lla = geo.lla_from_topocentric(point.coordinates[0], point.coordinates[1], point.coordinates[2], reference['latitude'], reference['longitude'], reference['altitude']) x, y = features.denormalized_image_coordinates( pixel.reshape(1, 2), shot.camera.width, shot.camera.height)[0] print "{} {} {} {} {} {}".format(lla[0], lla[1], lla[2], x, y, shot.id)