# Modified from # https://github.com/facebookresearch/votenet/blob/master/scannet/scannet_utils.py # Copyright (c) Facebook, Inc. and its affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. """Ref: https://github.com/ScanNet/ScanNet/blob/master/BenchmarkScripts """ import csv import os import numpy as np from plyfile import PlyData def represents_int(s): """Judge whether string s represents an int. Args: s(str): The input string to be judged. Returns: bool: Whether s represents int or not. """ try: int(s) return True except ValueError: return False def read_label_mapping(filename, label_from='raw_category', label_to='nyu40id'): assert os.path.isfile(filename) mapping = dict() with open(filename) as csvfile: reader = csv.DictReader(csvfile, delimiter='\t') for row in reader: mapping[row[label_from]] = int(row[label_to]) if represents_int(list(mapping.keys())[0]): mapping = {int(k): v for k, v in mapping.items()} return mapping def read_mesh_vertices(filename): """Read XYZ for each vertex. Args: filename(str): The name of the mesh vertices file. Returns: ndarray: Vertices. """ assert os.path.isfile(filename) with open(filename, 'rb') as f: plydata = PlyData.read(f) num_verts = plydata['vertex'].count vertices = np.zeros(shape=[num_verts, 3], dtype=np.float32) vertices[:, 0] = plydata['vertex'].data['x'] vertices[:, 1] = plydata['vertex'].data['y'] vertices[:, 2] = plydata['vertex'].data['z'] return vertices def read_mesh_vertices_rgb(filename): """Read XYZ and RGB for each vertex. Args: filename(str): The name of the mesh vertices file. Returns: Vertices. Note that RGB values are in 0-255. """ assert os.path.isfile(filename) with open(filename, 'rb') as f: plydata = PlyData.read(f) num_verts = plydata['vertex'].count vertices = np.zeros(shape=[num_verts, 6], dtype=np.float32) vertices[:, 0] = plydata['vertex'].data['x'] vertices[:, 1] = plydata['vertex'].data['y'] vertices[:, 2] = plydata['vertex'].data['z'] vertices[:, 3] = plydata['vertex'].data['red'] vertices[:, 4] = plydata['vertex'].data['green'] vertices[:, 5] = plydata['vertex'].data['blue'] return vertices