Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Geekgineer/motcpp

Open more actions menu

Repository files navigation

motcpp

motcpp

Modern C++ Multi-Object Tracking — 10 SOTA algorithms, production-ready, 10–100× faster than Python

CI Coverage Release License Stars

Features · Benchmarks · Installation · Quick Start · Trackers · Documentation · Citation


ByteTrack
ByteTrack — 1100 FPS
OC-SORT
OC-SORT — 850 FPS
BoostTrack
BoostTrack — HOTA 67.5
SORT
SORT — 1250 FPS

motcpp is a high-performance C++ library for multi-object tracking (MOT). It implements 10 state-of-the-art algorithms with a unified, modern C++17 API — covering everything from the lightweight SORT baseline to the current BoostTrack SOTA — all ready to drop into production.

Inspired by BoxMOT, motcpp brings the same algorithmic breadth to C++ with a clean CMake integration, ONNX Runtime ReID backend, and built-in MOT benchmark tooling.

✨ Features

  • 10 SOTA trackers — SORT, ByteTrack, OC-SORT, DeepOC-SORT, StrongSORT, BoT-SORT, BoostTrack, HybridSORT, UCMCTrack, OracleTrack
  • 10–100× faster than Python — optimized C++ hot paths, zero-copy Eigen matrices
  • Unified API — one update(dets, img) call across all trackers
  • ONNX ReID backend — plug in any appearance model as an .onnx file
  • Camera motion compensation — ORB/ECC/SoF CMC built-in
  • MOT benchmark tooling — evaluate on MOT17/MOT20 out of the box
  • >90% test coverage — GoogleTest suite across all components
  • Cross-platform — Linux, macOS, Windows (CI-verified)
  • Modern CMakefind_package, FetchContent, and vcpkg ready

📊 Benchmarks

MOT17 Ablation Split

Evaluated on the second half of the MOT17 training set using YOLOX detections and FastReID embeddings. Pre-generated data available in releases. FPS on Intel i9-13900K, single thread.

Tracker Type HOTA ↑ MOTA ↑ IDF1 ↑ FPS ↑
SORT Motion 62.4 75.2 69.2 1250
ByteTrack Motion 66.5 76.4 77.6 1100
OC-SORT Motion 64.6 73.9 74.4 850
UCMCTrack Motion 64.0 75.6 73.9 980
OracleTrack Motion 66.9 77.3 79.7 449
DeepOC-SORT ReID 65.8 75.1 76.2 120
StrongSORT ReID 66.2 75.8 77.1 95
BoT-SORT ReID 66.8 76.2 78.3 85
HybridSORT ReID 66.4 76.0 77.8 90
BoostTrack ReID 67.5 77.1 79.2 75

C++ vs Python

Tracker C++ (FPS) Python (FPS) Speedup
ByteTrack 1100 45 24×
OC-SORT 850 32 27×
StrongSORT 95 8 12×

🚀 Installation

Prerequisites

Dependency Version Required
C++ compiler (GCC / Clang / MSVC) C++17
CMake 3.20+
OpenCV 4.x
Eigen3 3.3+
yaml-cpp any
ONNX Runtime 1.16+ ReID only
Ubuntu / Debian
sudo apt-get update && sudo apt-get install -y \
    build-essential cmake \
    libeigen3-dev libopencv-dev libyaml-cpp-dev
macOS
brew install cmake eigen opencv yaml-cpp
Windows (vcpkg)
vcpkg install eigen3:x64-windows opencv4:x64-windows yaml-cpp:x64-windows

Build from Source

git clone https://github.com/Geekgineer/motcpp.git
cd motcpp
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(nproc)
sudo cmake --install build

CMake find_package

find_package(motcpp REQUIRED)
target_link_libraries(your_target PRIVATE motcpp::motcpp)

CMake FetchContent

include(FetchContent)
FetchContent_Declare(
    motcpp
    GIT_REPOSITORY https://github.com/Geekgineer/motcpp.git
    GIT_TAG        v1.0.0
)
FetchContent_MakeAvailable(motcpp)
target_link_libraries(your_target PRIVATE motcpp::motcpp)

Build Options

Option Default Description
MOTCPP_BUILD_TESTS ON GoogleTest unit tests
MOTCPP_BUILD_EXAMPLES ON Example binaries
MOTCPP_BUILD_TOOLS ON motcpp_eval CLI
MOTCPP_ENABLE_ONNX ON ONNX Runtime ReID backend
MOTCPP_COVERAGE OFF gcov/lcov coverage
BUILD_SHARED_LIBS OFF Build as shared library

🎮 Quick Start

Motion-Only Tracker (no ReID)

#include <motcpp/trackers/bytetrack.hpp>
#include <opencv2/opencv.hpp>

int main() {
    motcpp::trackers::ByteTrack tracker;

    cv::VideoCapture cap("video.mp4");
    cv::Mat frame;

    while (cap.read(frame)) {
        // Detector output: [x1, y1, x2, y2, confidence, class_id]
        Eigen::MatrixXf dets = your_detector(frame);

        // Update — returns [x1, y1, x2, y2, track_id, conf, class_id, det_idx]
        Eigen::MatrixXf tracks = tracker.update(dets, frame);

        for (int i = 0; i < tracks.rows(); ++i) {
            int id = static_cast<int>(tracks(i, 4));
            cv::Rect box(tracks(i, 0), tracks(i, 1),
                         tracks(i, 2) - tracks(i, 0),
                         tracks(i, 3) - tracks(i, 1));
            cv::rectangle(frame, box, motcpp::BaseTracker::id_to_color(id), 2);
            cv::putText(frame, "ID " + std::to_string(id),
                        box.tl(), cv::FONT_HERSHEY_SIMPLEX, 0.6,
                        motcpp::BaseTracker::id_to_color(id), 2);
        }

        cv::imshow("Tracking", frame);
        if (cv::waitKey(1) == 27) break;
    }
}

ReID-Enhanced Tracker

#include <motcpp/trackers/boosttrack.hpp>

// Point to a ReID ONNX model (see docs/guides/trackers.md for download)
motcpp::trackers::BoostTrackTracker tracker("osnet_x1_0.onnx");

while (cap.read(frame)) {
    Eigen::MatrixXf dets  = detector(frame);
    Eigen::MatrixXf tracks = tracker.update(dets, frame);
    // ...
}

Per-Class Tracking

motcpp::trackers::ByteTrack tracker(
    0.3f,   // det_thresh
    30,     // max_age
    50,     // max_obs
    3,      // min_hits
    0.3f,   // iou_threshold
    true,   // per_class — track each class independently
    80      // nr_classes
);

Reset Between Sequences

tracker.reset();   // clears all track state and ID counter

📋 Trackers

Choosing the Right Tracker

Need maximum throughput (>500 FPS)?
    └─ SORT or ByteTrack

General purpose, great accuracy/speed balance?
    └─ ByteTrack · OC-SORT · OracleTrack

Heavy occlusion or non-linear motion?
    └─ OC-SORT · UCMCTrack · OracleTrack

Moving or drone camera?
    └─ UCMCTrack · BoT-SORT · OracleTrack

Have a ReID model and need best accuracy?
    └─ BoostTrack · StrongSORT · BoT-SORT

All Trackers at a Glance

Tracker Type State Space Key Innovation Paper
SORT Motion XYSR IoU + Kalman baseline ICASSP 2016
ByteTrack Motion XYAH Two-stage low-conf association ECCV 2022
OC-SORT Motion XYSR Observation-centric momentum CVPR 2023
UCMCTrack Motion Ground plane Uniform camera motion compensation AAAI 2024
OracleTrack Motion XYAH CMC + cascaded matching + OC recovery
DeepOC-SORT ReID XYSR OC-SORT + appearance embeddings arXiv 2023
StrongSORT ReID XYAH NSA Kalman + EMA appearance TMM 2023
BoT-SORT ReID XYSR GMC camera compensation + ReID arXiv 2022
HybridSORT ReID XYSR Hybrid IoU + height-modulated IoU AAAI 2024
BoostTrack ReID XYSR Boosted similarity + detection confidence MVA 2024

Full parameter reference and per-tracker code snippets: docs/guides/trackers.md

ReID Model Download

# Download OSNet x1.0 (recommended — good accuracy/size balance)
./scripts/auto_benchmark.sh --download-reid

# Or directly:
wget https://github.com/Geekgineer/motcpp/releases/download/reid-models-v1.0.0/osnet_x1_0.onnx

🧪 Testing

cmake -B build -DMOTCPP_BUILD_TESTS=ON
cmake --build build -j$(nproc)
cd build && ctest --output-on-failure

# Single test suite
./build/tests/motcpp_tests --gtest_filter=ByteTrackTest.*

📚 Documentation

Resource Description
Getting Started Install, build, and run your first tracker
Tracker Guide Full parameter docs for all 10 algorithms
Architecture Kalman filters, association, ReID internals
Benchmarking Reproduce MOT17/20 results
API Reference Full C++ API
Tutorials Step-by-step examples

🤝 Contributing

Contributions are welcome — bug fixes, new trackers, documentation, benchmarks. See CONTRIBUTING.md for the workflow.

📜 Citation

If you use motcpp in your research, please cite:

@software{motcpp2026,
  author  = {motcpp contributors},
  title   = {motcpp: Modern C++ Multi-Object Tracking Library},
  year    = {2026},
  url     = {https://github.com/Geekgineer/motcpp},
  license = {AGPL-3.0}
}

Please also cite the original algorithm papers. See Acknowledgments below.

📄 License

Licensed under the GNU Affero General Public License v3.0. See LICENSE.

🙏 Acknowledgments

Tracking Algorithms

Algorithm Reference
SORT Bewley et al., Simple Online and Realtime Tracking, ICASSP 2016
ByteTrack Zhang et al., ByteTrack: Multi-Object Tracking by Associating Every Detection Box, ECCV 2022
OC-SORT Cao et al., Observation-Centric SORT, CVPR 2023
DeepOC-SORT Maggiolino et al., Deep OC-SORT, 2023
StrongSORT Du et al., StrongSORT: Make DeepSORT Great Again, TMM 2023
BoT-SORT Aharon et al., BoT-SORT: Robust Associations Multi-Pedestrian Tracking, 2022
UCMCTrack Yi et al., UCMCTrack: Multi-Object Tracking with Uniform Camera Motion Compensation, AAAI 2024
HybridSORT Yang et al., Hybrid-SORT: Weak Cues Matter for Online Multi-Object Tracking, AAAI 2024
BoostTrack Stanojevic et al., BoostTrack: Boosting the Similarity Measure and Detection Confidence, MVA 2024

Benchmark Tools

Resource Citation
MOT17 Dataset Milan et al., MOT16: A Benchmark for Multi-Object Tracking, 2016
YOLOX Detections Ge et al., YOLOX: Exceeding YOLO Series in 2021, 2021
FastReID Embeddings He et al., FastReID: A Pytorch Toolbox for General Instance Re-identification, 2020

Inspiration

motcpp follows the architecture and algorithmic patterns of BoxMOT by Mikel Broström — the Python multi-object tracking library that inspired this C++ port.


Made with ❤️ by the motcpp community

About

A blazing-fast, modern C++ multi-object tracking library featuring SORT, ByteTrack, OC-SORT, BoostTrack, and more built for real-time performance, cross-platform deployment, and MOT benchmarks.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages

Morty Proxy This is a proxified and sanitized view of the page, visit original site.