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]
Beispiel #2
0
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
        }
Beispiel #3
0
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)
Beispiel #4
0
 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]
Beispiel #6
0
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
Beispiel #7
0
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
Beispiel #8
0
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
Beispiel #10
0
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}
Beispiel #11
0
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)