Как правильно генерировать преобразование NerfStudio.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как правильно генерировать преобразование NerfStudio.

Сообщение Anonymous »

Я тренирую Nerf с Nerfstudio, используя изображения дронов из камеры Micasense Rededge-P. < /p>
Для каждого захвата I имеет метаданные: < /p>
  • lat, lon, alt (wgs84 position) < /li>
    yaw, wry roup (wgs84) < /li>
    yaw, wry micasse (wgs84) Радианы)
  • Внутренняя внутренняя камера (фокусное расстояние, основная точка, искажение)
Моя цель состоит в том, что при обучении NERF, реконструированное облако точек уже находится в географическом пространстве (UTM/WG84), так что я могу загрузить его непосредственно в программное обеспечение GIS (MetAshape) без подключения к GEORIGER), чтобы сборочно), так что в GEORINIGAL), чтобы сборочно), так что я могу загрузить его непосредственно в программное обеспечение GIS). это.
Что я сделал

[*] преобразовать 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»