An event camera processing library with a Rust backend and Python bindings, designed for scalable data processing with real-world event camera datasets.
Architecture
evlib keeps a thin Rust core and does all DataFrame work in Polars from Python:
- Rust (
evlib._evlib) handles only what cannot be expressed as DataFrame operations: binary format parsing (EVT2/EVT3/EVT2.1, AEDAT, AER, HDF5 with the ECF codec), construction of the Polars frame from decoded primitives, and the dense scatter-add that builds RVT stacked-histogram representations. - Python Polars handles all processing: loading filters, filtering
(
evlib.filtering), and representations (evlib.representations,evlib.rvt). Every query is a lazy PolarsLazyFramecollected with a selectable engine, so the same code runs on the CPU streaming engine today and on the GPU via cudf-polars (collect(engine="gpu")) where CUDA is available.
evlib.load_events returns a LazyFrame and applies any time, spatial, or
polarity filters as Polars expressions, so loading and filtering fuse into one
GPU-collectable query.
Full documentation: https://tallamjr.github.io/evlib/
Quick Start

What are Event Cameras?
Event cameras (also called neuromorphic or dynamic vision sensors) operate asynchronously: each pixel independently reports brightness changes as they occur, rather than sampling frames at a fixed rate.
Each event is represented as a 4-tuple:
$$e = (x, y, t, p)$$
Where:
- $x, y \in \mathbb{N}$: Pixel coordinates
- $t \in \mathbb{R}^+$: Timestamp (microsecond precision)
- $p \in {-1, +1}$ or ${0, 1}$: Polarity (brightness change direction)
An event fires when the logarithmic brightness change exceeds a threshold:
$$\log(L(x,y,t)) - \log(L(x,y,t_{\text{last}})) > \pm C$$
where $C$ is the contrast threshold. This yields microsecond temporal resolution, 120 dB+ dynamic range, and data sparsity proportional to scene motion.
For a deeper introduction, see the user guide.
Basic Usage
# Automatic format detection — returns a Polars LazyFrame
=
=
Chain Polars expressions for efficient filtering and representation extraction:
=
# Temporal + spatial + polarity filtering, lazily
=
# Produce a stacked histogram ready for an RVT-style model
=
See the representations guide for voxel grids, time surfaces, and mixed density stacks.
Installation
# Basic install
# With PyTorch integration
From source (requires Rust nightly and maturin):
&&
HDF5 is opt-in on Linux/macOS and unavailable on Windows — use h5py directly
for HDF5 I/O on Windows. Full details and platform-specific notes live in
the installation guide.
Documentation
Complete documentation is published at https://tallamjr.github.io/evlib/:
- Quick Start
- Loading Data — formats, polarity encoding, streaming
- Event Representations
- Polars Preprocessing
- Performance Guide — benchmarks, memory monitoring, troubleshooting
- API Reference
- Platform Support
Examples
Runnable examples live in examples/:
# Jupyter notebooks
Benchmarks and performance scripts live in benches/.
Development
# Tests
# Formatting / linting
See CONTRIBUTING and the architecture overview for design details.
Community & Support
- Issues: Report bugs and request features

License
MIT License — see LICENSE.md for details.