File size: 2,524 Bytes
23e73f9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import sys
import os

# 动态将 taming-3dgs 路径加入,利用其内置的 colmap_loader
sys.path.append("/root/autodl-tmp/taming-3dgs")
try:
    from scene.colmap_loader import read_extrinsics_binary, read_intrinsics_binary, qvec2rotmat
    from scene.colmap_loader import read_points3D_binary
except ImportError:
    print("❌ 找不到 taming-3dgs 路径,请确认目录存在。")
    sys.exit(1)

def convert():
    base_path = "/root/autodl-tmp/dataset/synthetic_nerf/Synthetic_NeRF/Lego/sparse/0"
    print(f"🔄 正在手动解析二进制并生成文本文件: {base_path}")
    
    # 1. 处理相机的内参 (Intrinsics)
    try:
        intrinsics = read_intrinsics_binary(os.path.join(base_path, "cameras.bin"))
        with open(os.path.join(base_path, "cameras.txt"), "w") as f:
            for i in intrinsics:
                # 格式: CAMERA_ID MODEL WIDTH HEIGHT PARAMS[]
                params = " ".join([str(p) for p in intrinsics[i].params])
                f.write(f"{i} {intrinsics[i].model} {intrinsics[i].width} {intrinsics[i].height} {params}\n")
        print("  - cameras.txt 生成成功")
    except Exception as e: print(f"  - cameras 转换失败: {e}")

    # 2. 处理外参和图像 (Extrinsics/Images)
    try:
        extrinsics = read_extrinsics_binary(os.path.join(base_path, "images.bin"))
        with open(os.path.join(base_path, "images.txt"), "w") as f:
            for i in extrinsics:
                e = extrinsics[i]
                q = " ".join([str(x) for x in e.qvec])
                t = " ".join([str(x) for x in e.tvec])
                # 第一行: IMAGE_ID QW QX QY QZ TX TY TZ CAMERA_ID NAME
                f.write(f"{i} {q} {t} {e.camera_id} {e.name}\n")
                # 第二行: POINTS2D (Blender 数据通常是空的或占位符)
                f.write("\n")
        print("  - images.txt 生成成功")
    except Exception as e: print(f"  - images 转换失败: {e}")

    # 3. 处理点云 (Points3D)
    try:
        pts3d = read_points3D_binary(os.path.join(base_path, "points3D.bin"))
        with open(os.path.join(base_path, "points3D.txt"), "w") as f:
            for i in pts3d:
                p = pts3d[i]
                xyz = " ".join([str(x) for x in p.xyz])
                rgb = " ".join([str(x) for x in p.rgb])
                f.write(f"{i} {xyz} {rgb} {p.error} 0\n")
        print("  - points3D.txt 生成成功")
    except Exception as e: print(f"  - points3D 转换失败: {e}")

if __name__ == "__main__":
    convert()