Source code for tonic.functional.to_voxel_grid

import numpy as np


# Code adapted from https://github.com/uzh-rpg/rpg_e2vid/blob/master/utils/inference_utils.py#L431
[docs]def to_voxel_grid_numpy(events, sensor_size, n_time_bins=10): """Build a voxel grid with bilinear interpolation in the time domain from a set of events. Implements the event volume from Zhu et al. 2019, Unsupervised event-based learning of optical flow, depth, and egomotion. Parameters: events: ndarray of shape [num_events, num_event_channels] sensor_size: size of the sensor that was used [W,H]. n_time_bins: number of bins in the temporal axis of the voxel grid. Returns: numpy array of n event volumes (n,w,h,t) """ assert "x" and "y" and "t" and "p" in events.dtype.names assert sensor_size[2] == 2 voxel_grid = np.zeros((n_time_bins, sensor_size[1], sensor_size[0]), float).ravel() # normalize the event timestamps so that they lie between 0 and n_time_bins ts = ( n_time_bins * (events["t"].astype(float) - events["t"][0]) / (events["t"][-1] - events["t"][0]) ) xs = events["x"].astype(int) ys = events["y"].astype(int) pols = events["p"] pols[pols == 0] = -1 # polarity should be +1 / -1 tis = ts.astype(int) dts = ts - tis vals_left = pols * (1.0 - dts) vals_right = pols * dts valid_indices = tis < n_time_bins np.add.at( voxel_grid, xs[valid_indices] + ys[valid_indices] * sensor_size[0] + tis[valid_indices] * sensor_size[0] * sensor_size[1], vals_left[valid_indices], ) valid_indices = (tis + 1) < n_time_bins np.add.at( voxel_grid, xs[valid_indices] + ys[valid_indices] * sensor_size[0] + (tis[valid_indices] + 1) * sensor_size[0] * sensor_size[1], vals_right[valid_indices], ) voxel_grid = np.reshape( voxel_grid, (n_time_bins, 1, sensor_size[1], sensor_size[0]) ) return voxel_grid