From 6e2c946e0cb2bcf4af8d2754b94a48cb6d66995d Mon Sep 17 00:00:00 2001 From: Afloat Date: Sat, 7 Nov 2026 02:54:53 +0800 Subject: [PATCH] Write UTF-8 image names intact in COLMAP binary models --- nerfstudio/data/utils/colmap_parsing_utils.py | 3 +-- .../test_colmap_binary_image_names.py | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 tests/process_data/test_colmap_binary_image_names.py diff --git a/nerfstudio/data/utils/colmap_parsing_utils.py b/nerfstudio/data/utils/colmap_parsing_utils.py index 0eeaf6911..1bc24516b 100644 --- a/nerfstudio/data/utils/colmap_parsing_utils.py +++ b/nerfstudio/data/utils/colmap_parsing_utils.py @@ -300,8 +300,7 @@ def write_images_binary(images, path_to_model_file): write_next_bytes(fid, img.qvec.tolist(), "dddd") write_next_bytes(fid, img.tvec.tolist(), "ddd") write_next_bytes(fid, img.camera_id, "i") - for char in img.name: - write_next_bytes(fid, char.encode("utf-8"), "c") + fid.write(img.name.encode("utf-8")) write_next_bytes(fid, b"\x00", "c") write_next_bytes(fid, len(img.point3D_ids), "Q") for xy, p3d_id in zip(img.xys, img.point3D_ids): diff --git a/tests/process_data/test_colmap_binary_image_names.py b/tests/process_data/test_colmap_binary_image_names.py new file mode 100644 index 000000000..72dd6af56 --- /dev/null +++ b/tests/process_data/test_colmap_binary_image_names.py @@ -0,0 +1,24 @@ +from pathlib import Path + +import numpy as np + +from nerfstudio.data.utils.colmap_parsing_utils import Image, read_images_binary, write_images_binary + + +def test_multibyte_image_name_roundtrip(tmp_path: Path): + image = Image( + id=7, + qvec=np.array([1, 0, 0, 0]), + tvec=np.zeros(3), + camera_id=3, + name="室内/café.png", + xys=np.array([[2.5, 1.0]]), + point3D_ids=np.array([17]), + ) + path = tmp_path / "images.bin" + write_images_binary({image.id: image}, path) + restored = read_images_binary(path)[image.id] + + assert restored.name == image.name + np.testing.assert_array_equal(restored.xys, image.xys) + np.testing.assert_array_equal(restored.point3D_ids, image.point3D_ids)