From 8af1b63d0cf8d7a1e58f75d9c8b8122a8e51a011 Mon Sep 17 00:00:00 2001 From: Afloat Date: Sat, 7 Nov 2026 02:54:59 +0800 Subject: [PATCH] Preserve the vertical focal length from Record3D calibration --- nerfstudio/process_data/record3d_utils.py | 5 ++--- tests/process_data/test_record3d_intrinsics.py | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 tests/process_data/test_record3d_intrinsics.py diff --git a/nerfstudio/process_data/record3d_utils.py b/nerfstudio/process_data/record3d_utils.py index 50212c2b2..45867bd48 100644 --- a/nerfstudio/process_data/record3d_utils.py +++ b/nerfstudio/process_data/record3d_utils.py @@ -75,7 +75,6 @@ def record3d_to_json( # Camera intrinsics K = np.array(metadata_dict["K"]).reshape((3, 3)).T - focal_length = K[0, 0] H = metadata_dict["h"] W = metadata_dict["w"] @@ -85,8 +84,8 @@ def record3d_to_json( cx, cy = W / 2, H / 2 out = { - "fl_x": focal_length, - "fl_y": focal_length, + "fl_x": K[0, 0], + "fl_y": K[1, 1], "cx": cx, "cy": cy, "w": W, diff --git a/tests/process_data/test_record3d_intrinsics.py b/tests/process_data/test_record3d_intrinsics.py new file mode 100644 index 000000000..7479e5d42 --- /dev/null +++ b/tests/process_data/test_record3d_intrinsics.py @@ -0,0 +1,17 @@ +import json +from pathlib import Path + +import numpy as np + +from nerfstudio.process_data.record3d_utils import record3d_to_json + + +def test_record3d_preserves_distinct_focal_lengths(tmp_path: Path): + intrinsics = np.array([[500, 0, 320], [0, 525, 240], [0, 0, 1]], dtype=float) + metadata = {"K": intrinsics.T.flatten().tolist(), "h": 480, "w": 640, "poses": [[0, 0, 0, 1, 0, 0, 0]]} + path = tmp_path / "metadata.json" + path.write_text(json.dumps(metadata)) + record3d_to_json([Path("frame.png")], path, tmp_path, np.array([0]), None, None) + + output = json.loads((tmp_path / "transforms.json").read_text()) + assert (output["fl_x"], output["fl_y"]) == (500, 525)