# 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): ''' if string s represents an int. ''' 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. """ 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 RGB for each vertex. Note: 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