RapidTag
Rust · Python / PyO3 · Apache-2.0
Track markers. Keep the frame rate.
ArUco and AprilTag detection implemented in Rust and exposed to Python, without an OpenCV runtime dependency. Built for camera tracking, robotics, and experiments that need fast marker detection.
- Single-frame and parallel batch detection
- ChArUco and chessboard detection
- PnP, RANSAC, and multi-marker rigid-body pose
- Wheels for Windows, Linux, and macOS
Pre-1.0 · Active development; intended for research and prototyping.
pip install rapidtag Python example
import rapidtag
# A grayscale or BGR uint8 NumPy image
corners, ids = rapidtag.detect_markers(
image, "DICT_APRILTAG_36h11"
)
# Process a stereo pair or a recording across cores
results = rapidtag.detect_markers_batch(
[left_image, right_image], "DICT_APRILTAG_36h11"
) Detection throughput
Local measurement · 17 Oct 2026Frames / second · higher is better
2.05 ms / frame
Single-frame latency in this run
0.0000 px
Maximum corner difference on 400 matched markers
Benchmark conditions & measured timings
13th Gen Intel(R) Core(TM) i7-13700HX · 24 logical CPUs · Windows-11-10.0.26200-SP0. Python 3.13.5, RapidTag 0.1.8, OpenCV 5.0.0 (24 configured threads). 20 warmup frames; Median of per-repetition mean wall-clock times; disk I/O excluded.
OpenCV uses ArucoDetector defaults. Stereo and batch baselines call OpenCV sequentially; RapidTag uses its parallel batch API. These comparisons include the benefit of batch parallelism. Disk I/O is excluded.
| Workload | RapidTag | OpenCV | Ratio |
|---|---|---|---|
| Single frame | 2.05 ms | 3.91 ms | 1.91× |
| Stereo pair | 2.62 ms | 8.87 ms | 3.38× |
| Offline batch (400 frames) | 280.42 ms | 1809.92 ms | 6.45× |
In 400 tested frames: 400 matched markers, 0 RapidTag-only and 0 OpenCV-only detections. This is one recording on one machine, using installed builds; speed and agreement depend on data, settings, and hardware.
Pose comparison on a longer stereo recording