import os os.environ.setdefault("OPENCV_IO_ENABLE_OPENEXR", "1") import cv2 import numpy as np def frame_stems(image_paths): stems = [os.path.splitext(os.path.basename(p))[0] for p in image_paths] if len(set(stems)) == len(stems): return stems parents = [os.path.basename(os.path.dirname(p)) for p in image_paths] if len(set(parents)) == len(parents): return parents return stems def read_pred_w2c_txt(path): frames = [] poses = [] if not os.path.exists(path): return frames, poses with open(path, "r") as f: for line in f: line = line.strip() if not line or line.startswith("#"): continue vals = [float(x) for x in line.split()] if len(vals) != 13: continue frame = int(vals[0]) mat = np.eye(4, dtype=np.float64) mat[:3, :3] = np.asarray(vals[1:10], dtype=np.float64).reshape(3, 3) mat[:3, 3] = np.asarray(vals[10:13], dtype=np.float64) frames.append(frame) poses.append(mat) return frames, poses def read_opencv_camera_yml(extri_path, intri_path=None): if not os.path.exists(extri_path): return {}, {}, {} fs_extri = cv2.FileStorage(extri_path, cv2.FILE_STORAGE_READ) names_node = fs_extri.getNode("names") names = [] for i in range(names_node.size()): names.append(names_node.at(i).string()) extri = {} for name in names: rot = fs_extri.getNode(f"Rot_{name}").mat() t = fs_extri.getNode(f"T_{name}").mat() if rot is None or t is None: continue mat = np.eye(4, dtype=np.float64) mat[:3, :3] = np.asarray(rot, dtype=np.float64) mat[:3, 3] = np.asarray(t, dtype=np.float64).reshape(3) extri[name] = mat fs_extri.release() intri = {} image_sizes = {} if intri_path is not None and os.path.exists(intri_path): fs_intri = cv2.FileStorage(intri_path, cv2.FILE_STORAGE_READ) for name in names: K = fs_intri.getNode(f"K_{name}").mat() if K is None: continue intri[name] = np.asarray(K, dtype=np.float64) h_node = fs_intri.getNode(f"H_{name}") w_node = fs_intri.getNode(f"W_{name}") if not h_node.empty() and not w_node.empty(): image_sizes[name] = (int(h_node.real()), int(w_node.real())) fs_intri.release() return extri, intri, image_sizes def read_depth(path): depth = cv2.imread(path, cv2.IMREAD_ANYDEPTH) if depth is None: raise FileNotFoundError(path) return depth.astype(np.float32) def read_ply_xyz(path): if not os.path.exists(path): raise FileNotFoundError(path) header = [] with open(path, "rb") as f: while True: line = f.readline() if not line: raise ValueError(f"Invalid PLY header: {path}") text = line.decode("ascii").strip() header.append(text) if text == "end_header": break if "format binary_little_endian 1.0" not in header: raise ValueError(f"Unsupported PLY format: {path}") vertex_count = None property_specs = [] in_vertex_block = False for line in header: if line.startswith("element vertex "): vertex_count = int(line.split()[-1]) in_vertex_block = True continue if line.startswith("element ") and not line.startswith("element vertex "): in_vertex_block = False if in_vertex_block and line.startswith("property "): _, dtype_name, prop_name = line.split() property_specs.append((dtype_name, prop_name)) if vertex_count is None: raise ValueError(f"Missing vertex count in PLY: {path}") dtype_map = { "float": "