Для каждого захвата I имеет метаданные: < /p>
- lat, lon, alt (wgs84 position) < /li>
yaw, wry roup (wgs84) < /li>
yaw, wry micasse (wgs84) Радианы) - Внутренняя внутренняя камера (фокусное расстояние, основная точка, искажение)
Что я сделал
[*] преобразовать lat, lon, alt → utm Zone 6n (epsg: 32606).
[*] build votation matrix от yaw, with, with, with. />
Construct [r | t] 4 × 4 матриц преобразования. /> В действительности все позиции камеры выходят вниз (надир), но когда я визуализирую набор данных в зрителе NerfStudio, позы камера разбросаны и колючи. Зритель показывает Cscattered Amera Frustrums "src =" https://i.sstatic.net/efrhh4vi.png "/>
Вот код, который я в настоящее время использую, чтобы сгенерировать преобразование.import json
import numpy as np
import pyproj
# --- Rotation from yaw, pitch, roll (radians) ---
# NOTE: Nerfstudio expects OpenGL-style (X right, Y up, Z back).
# MicaSense yaw/pitch/roll are in NED, so we adjust to ENU.
def rotation_matrix(yaw, pitch, roll):
# Convert NED -> ENU by flipping pitch and roll
pitch = -pitch
roll = -roll
cy, sy = np.cos(yaw), np.sin(yaw)
cp, sp = np.cos(pitch), np.sin(pitch)
cr, sr = np.cos(roll), np.sin(roll)
R = np.array([
[cy * cp, cy * sp * sr - sy * cr, cy * sp * cr + sy * sr],
[sy * cp, sy * sp * sr + cy * cr, sy * sp * cr - cy * sr],
[-sp, cp * sr, cp * cr]
])
return R
# --- Projection (WGS84 -> UTM Zone 6N) ---
wgs84 = pyproj.CRS("EPSG:4326")
utm6n = pyproj.CRS("EPSG:32606")
transformer = pyproj.Transformer.from_crs(wgs84, utm6n, always_xy=True)
def geodetic_to_utm(lat, lon, alt):
e, n, h = transformer.transform(lon, lat, alt)
return np.array([e, n, h])
# --- Read metadata from data.json ---
with open("data.json", "r") as f:
data_list = json.load(f)
positions = []
rotations = []
frames = []
# Collect positions/rotations
for entry in data_list:
lat = entry["lat"]
lon = entry["lon"]
alt = entry["alt"]
yaw = entry["yaw"]
pitch = entry["pitch"]
roll = entry["roll"]
# Position in UTM Zone 6N
t = geodetic_to_utm(lat, lon, alt)
positions.append(t)
# Orientation matrix
R = rotation_matrix(yaw, pitch, roll)
rotations.append(R)
# Recenter translations (move mean position to origin)
positions = np.array(positions)
center = positions.mean(axis=0)
positions -= center
# Build frames list
for entry, t, R in zip(data_list, positions, rotations):
T = np.eye(4)
T[:3, :3] = R
T[:3, 3] = t
frame = {
"file_path": entry.get("file_path", f"images/frame_{entry['capture_id']:05d}.jpeg"),
"transform_matrix": T.tolist()
}
frames.append(frame)
# --- Use intrinsics stored in the first entry of data.json ---
first = data_list[0]
transforms = {
"camera_model": first.get("camera_model", "OPENCV_FISHEYE"),
"fl_x": first["fl_x"],
"fl_y": first["fl_y"],
"cx": first["cx"],
"cy": first["cy"],
"w": first["w"],
"h": first["h"],
"k1": first.get("k1", 0.0),
"k2": first.get("k2", 0.0),
"k3": first.get("k3", 0.0),
"k4": first.get("k4", 0.0),
"p1": first.get("p1", 0.0),
"p2": first.get("p2", 0.0),
"frames": frames
}
with open("transforms.json", "w") as f:
json.dump(transforms, f, indent=2)
print("Wrote transforms.json with", len(frames), "frames")
Подробнее здесь: https://stackoverflow.com/questions/797 ... -yaw-pitch