{
  "access": {
    "embargo": {
      "active": false,
      "reason": null
    },
    "files": "public",
    "record": "public",
    "status": "open"
  },
  "created": "2026-05-13T21:01:27.510278+00:00",
  "custom_fields": {
    "code:codeRepository": "https://github.com/rfonod/stabilo",
    "code:programmingLanguage": [
      {
        "id": "python",
        "title": {
          "en": "Python"
        }
      }
    ],
    "meeting:meeting": {
      "url": "https://www.real-lab.ch/open-science"
    }
  },
  "deletion_status": {
    "is_deleted": false,
    "status": "P"
  },
  "files": {
    "count": 1,
    "enabled": true,
    "entries": {
      "rfonod/stabilo-v1.2.0.zip": {
        "access": {
          "hidden": false
        },
        "checksum": "md5:46f525caca71e6da242c118fe0d57c75",
        "ext": "zip",
        "id": "7112a1e7-7bb4-4a35-8785-c0e4396823e7",
        "key": "rfonod/stabilo-v1.2.0.zip",
        "links": {
          "content": "https://zenodo.org/api/records/20171951/files/rfonod/stabilo-v1.2.0.zip/content",
          "self": "https://zenodo.org/api/records/20171951/files/rfonod/stabilo-v1.2.0.zip"
        },
        "metadata": null,
        "mimetype": "application/zip",
        "size": 148861991,
        "storage_class": "L"
      }
    },
    "order": [],
    "total_bytes": 148861991
  },
  "id": "20171951",
  "is_draft": false,
  "is_published": true,
  "links": {
    "access": "https://zenodo.org/api/records/20171951/access",
    "access_grants": "https://zenodo.org/api/records/20171951/access/grants",
    "access_links": "https://zenodo.org/api/records/20171951/access/links",
    "access_request": "https://zenodo.org/api/records/20171951/access/request",
    "access_users": "https://zenodo.org/api/records/20171951/access/users",
    "archive": "https://zenodo.org/api/records/20171951/files-archive",
    "archive_media": "https://zenodo.org/api/records/20171951/media-files-archive",
    "communities": "https://zenodo.org/api/records/20171951/communities",
    "communities-suggestions": "https://zenodo.org/api/records/20171951/communities-suggestions",
    "doi": "https://doi.org/10.5281/zenodo.20171951",
    "draft": "https://zenodo.org/api/records/20171951/draft",
    "file_modification": "https://zenodo.org/api/records/20171951/file-modification",
    "files": "https://zenodo.org/api/records/20171951/files",
    "latest": "https://zenodo.org/api/records/20171951/versions/latest",
    "latest_html": "https://zenodo.org/records/20171951/latest",
    "media_files": "https://zenodo.org/api/records/20171951/media-files",
    "parent": "https://zenodo.org/api/records/12117092",
    "parent_doi": "https://doi.org/10.5281/zenodo.12117092",
    "parent_doi_html": "https://zenodo.org/doi/10.5281/zenodo.12117092",
    "parent_html": "https://zenodo.org/records/12117092",
    "preview_html": "https://zenodo.org/records/20171951?preview=1",
    "quota_increase": "https://zenodo.org/api/records/20171951/quota-increase",
    "request_deletion": "https://zenodo.org/api/records/20171951/request-deletion",
    "requests": "https://zenodo.org/api/records/20171951/requests",
    "reserve_doi": "https://zenodo.org/api/records/20171951/draft/pids/doi",
    "self": "https://zenodo.org/api/records/20171951",
    "self_doi": "https://doi.org/10.5281/zenodo.20171951",
    "self_doi_html": "https://zenodo.org/doi/10.5281/zenodo.20171951",
    "self_html": "https://zenodo.org/records/20171951",
    "self_iiif_manifest": "https://zenodo.org/api/iiif/record:20171951/manifest",
    "self_iiif_sequence": "https://zenodo.org/api/iiif/record:20171951/sequence/default",
    "versions": "https://zenodo.org/api/records/20171951/versions"
  },
  "media_files": {
    "count": 0,
    "enabled": false,
    "entries": {},
    "order": [],
    "total_bytes": 0
  },
  "metadata": {
    "creators": [
      {
        "affiliations": [
          {
            "name": "EPFL"
          }
        ],
        "person_or_org": {
          "family_name": "Fonod",
          "given_name": "Robert",
          "identifiers": [
            {
              "identifier": "0000-0002-9434-3156",
              "scheme": "orcid"
            }
          ],
          "name": "Fonod, Robert",
          "type": "personal"
        }
      }
    ],
    "dates": [
      {
        "date": "2026-05-13",
        "description": "Update from v1.1.0 to v1.2.0",
        "type": {
          "id": "updated",
          "title": {
            "de": "Aktualisiert",
            "en": "Updated"
          }
        }
      }
    ],
    "description": "<p><strong>Stabilo</strong> is a specialized Python package for stabilizing video frames or tracked object trajectories in videos, using robust homography or affine transformations. Its core functionality focuses on aligning each frame or object track to a chosen reference frame, enabling precise stabilization that mitigates disturbances like camera movements. Key features include robust keypoint-based image registration and the option to integrate user-defined masks, which exclude dynamic regions (e.g., moving objects) to enhance stabilization accuracy. Integrating seamlessly with object detection and tracking algorithms, Stabilo is ideal for high-precision applications like urban traffic monitoring, as demonstrated in the <a href=\"https://github.com/rfonod/geo-trax\">Geo-trax</a> \ud83d\ude80 trajectory extraction framework. Extensive transformation and enhancement options, including multiple feature detectors and matchers, masking techniques, further expand its utility. For systematic evaluation and hyperparameter tuning, the companion tool <a href=\"https://github.com/rfonod/stabilo-optimize\">Stabilo-Optimize</a> \ud83c\udfaf provides a dedicated benchmarking framework. The repository also includes valuable resources like utility scripts and example videos to demonstrate its capabilities.</p>\n<p>\ud83d\udccc <strong>Important:</strong> If you use this code in your work,&nbsp;kindly acknowledge it by citing the following article:</p>\n<blockquote>\n<p><strong>Robert Fonod, Haechan Cho, Hwasoo Yeo, Nikolas Geroliminis</strong> (2025). <em>Advanced computer vision for extracting georeferenced vehicle trajectories from drone imagery</em>, Transportation Research Part C: Emerging Technologies, vol. 178, 105205.&nbsp;DOI: <a href=\"https://doi.org/10.1016/j.trc.2025.105205\">10.1016/j.trc.2025.105205</a></p>\n</blockquote>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Features</h2>\n<a class=\"anchor\" href=\"https://github.com/rfonod/stabilo#features\"></a></div>\n<ul>\n<li><strong>Video Stabilization</strong>: Align (warp) all video frames to a custom (anchor) reference frame using homography or affine transformations.</li>\n<li><strong>Trajectory Stabilization</strong>: Transform object trajectories (e.g., bounding boxes) to a common fixed reference frame using homography or affine transformations.</li>\n<li><strong>User-Defined Masks</strong>: Allow users to specify custom masks to exclude regions of interest during stabilization, supporting axis-aligned boxes, oriented bounding boxes (OBBs), four-point boxes, polygonal masks, and circular masks.</li>\n<li><strong>Wide Range of Algorithms</strong>: Includes support for various feature detectors (ORB, SIFT, RSIFT, BRISK, KAZE, AKAZE), matchers (BF, FLANN), RANSAC algorithms (MAGSAC++, DEGENSAC, ...), transformation types, and pre-processing options.</li>\n<li><strong>Customizable Parameters</strong>: Fine-tune the stabilization by adjusting parameters such as the number of keypoints, RANSAC parameters, matching thresholds, downsampling factors, etc..</li>\n<li><strong>Visualization Tools</strong>: Generate visualizations of the stabilization process, with frame-by-frame comparisons and trajectory transformations (see the above animation).</li>\n<li><strong>Threshold Analysis</strong>: Analyze the relationship between detection thresholds and keypoint counts for BRISK, KAZE, and AKAZE to fairly benchmark with different detectors.</li>\n<li><strong>Benchmarking and Optimization</strong>: Fine-tune stabilization parameters with <a href=\"https://github.com/rfonod/stabilo-optimize\">Stabilo-Optimize</a> \ud83c\udfaf, which provides ground truth-free evaluation using random perturbations.</li>\n</ul>\n<p><strong>\ud83d\ude80 Planned Enhancements</strong></p>\n<ul>\n<li><strong>GPU Acceleration</strong>: Integration of GPU acceleration to improve processing speed.</li>\n<li><strong>Bi-directional Matching</strong>: Implementing bi-directional matching to enhance the robustness of keypoint matching.</li>\n<li><strong>Additional Feature Detectors</strong>: Adding support for more feature detectors and matchers to provide users with a wider range of options for stabilization.</li>\n</ul>\n<p><strong>\ud83d\udd17 Related Projects</strong></p>\n<p>Stabilo integrates with and complements several specialized tools:</p>\n<ul>\n<li>\n<p><strong><a href=\"https://github.com/rfonod/geo-trax\">Geo-trax</a> \ud83d\ude80</strong> &mdash; End-to-end framework for extracting georeferenced vehicle trajectories from drone imagery. Uses Stabilo as its core stabilization engine to align video frames and vehicle tracks to a common reference frame.</p>\n</li>\n<li>\n<p><strong><a href=\"https://github.com/rfonod/stabilo-optimize\">Stabilo-Optimize</a> \ud83c\udfaf</strong> &mdash; Benchmarking and hyperparameter optimization framework for Stabilo. Evaluates stabilization performance through ground truth-free assessment using random perturbations. Used to fine-tune Stabilo parameters.</p>\n</li>\n<li>\n<p><strong><a href=\"https://github.com/rfonod/hbb2obb\">HBB2OBB</a> \ud83d\udce6</strong> &mdash; Converts horizontal bounding boxes to oriented bounding boxes using SAM segmentation models. Can be used alongside Stabilo when object orientation is needed for downstream analysis.</p>\n</li>\n</ul>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Installation</h2>\n<a class=\"anchor\" href=\"https://github.com/rfonod/stabilo#installation\"></a></div>\n<p>It is recommended to create and activate a <strong>Python Virtual Environment</strong> (Python &gt;= 3.9) first. You can use Python's built-in <code>venv</code> module:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\">\n<pre><code>python -m venv .venv\n<span class=\"pl-c1\">source</span> .venv/bin/activate   <span class=\"pl-c\"># On Windows: .venv\\Scripts\\activate</span></code></pre>\n</div>\n<p>Alternatively, you can use <a href=\"https://docs.anaconda.com/free/miniconda/\" rel=\"nofollow\">Miniconda3</a>:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\">\n<pre><code>conda create -n stabilo python=3.11 -y\nconda activate stabilo</code></pre>\n</div>\n<p>Then, install the stabilo library using one of the following options:</p>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">Option 1: Install from PyPI</h3>\n<a class=\"anchor\" href=\"https://github.com/rfonod/stabilo#option-1-install-from-pypi\"></a></div>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\">\n<pre><code>pip install stabilo</code></pre>\n</div>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">Option 2: Install from Local Source</h3>\n<a class=\"anchor\" href=\"https://github.com/rfonod/stabilo#option-2-install-from-local-source\"></a></div>\n<p>You can also clone the repository and install the package from the local source:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\">\n<pre><code>git clone https://github.com/rfonod/stabilo.git\n<span class=\"pl-c1\">cd</span> stabilo <span class=\"pl-k\">&amp;&amp;</span> pip install <span class=\"pl-c1\">.</span></code></pre>\n</div>\n<p>If you want the changes you make in the repo to be reflected in your install, use <code>pip install -e .</code> instead of <code>pip install .</code>.</p>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Python API Usage</h2>\n<a class=\"anchor\" href=\"https://github.com/rfonod/stabilo#python-api-usage\"></a></div>\n<div class=\"highlight highlight-source-python notranslate position-relative overflow-auto\">\n<pre><code><span class=\"pl-k\">from</span> <span class=\"pl-s1\">stabilo</span> <span class=\"pl-k\">import</span> <span class=\"pl-v\">Stabilizer</span> \n\n<span class=\"pl-c\"># Create an instance of the Stabilizer class with default parameters</span>\n<span class=\"pl-s1\">stabilizer</span> <span class=\"pl-c1\">=</span> <span class=\"pl-en\">Stabilizer</span>() \n\n<span class=\"pl-c\"># Set a reference frame with (optional) mask</span>\n<span class=\"pl-s1\">stabilizer</span>.<span class=\"pl-c1\">set_ref_frame</span>(<span class=\"pl-s1\">ref_frame</span>, <span class=\"pl-s1\">ref_mask</span>)\n\n<span class=\"pl-c\"># Stabilize any frame with (optional) mask</span>\n<span class=\"pl-s1\">stabilizer</span>.<span class=\"pl-c1\">stabilize</span>(<span class=\"pl-s1\">cur_frame</span>, <span class=\"pl-s1\">cur_mask</span>)\n\n<span class=\"pl-c\"># Get the stabilized (warped) frame </span>\n<span class=\"pl-s1\">stabilized_frame</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">stabilizer</span>.<span class=\"pl-c1\">warp_cur_frame</span>()\n\n<span class=\"pl-c\"># Transform current masks (bounding boxes) if it was provided</span>\n<span class=\"pl-s1\">stabilized_boxes</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">stabilizer</span>.<span class=\"pl-c1\">transform_cur_boxes</span>()\n\n<span class=\"pl-c\"># Transform any point (pixel coordinates) from the current frame to reference frame</span>\n<span class=\"pl-s1\">cur_point</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">np</span>.<span class=\"pl-c1\">array</span>([<span class=\"pl-s1\">x</span>, <span class=\"pl-s1\">y</span>, <span class=\"pl-c1\">1</span>])\n<span class=\"pl-s1\">ref_point</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">stabilizer</span>.<span class=\"pl-c1\">get_cur_trans_matrix</span>() @ <span class=\"pl-s1\">cur_point</span></code></pre>\n</div>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">Bounding Box Formats</h3>\n<a class=\"anchor\" href=\"https://github.com/rfonod/stabilo#bounding-box-formats\"></a></div>\n<p>Stabilo supports multiple mask and bounding-box formats:</p>\n<ul>\n<li><strong><code>xywh</code></strong>: Axis-aligned boxes <code>[x_center, y_center, width, height]</code></li>\n<li><strong><code>xywha</code></strong>: Oriented bounding boxes <code>[x_center, y_center, width, height, angle_degrees]</code></li>\n<li><strong><code>four</code></strong>: Four corner points <code>[x1, y1, x2, y2, x3, y3, x4, y4]</code> (auto-detects if rotated)</li>\n<li><strong><code>polygon</code></strong>: Polygon points as flattened rows <code>[x1, y1, ..., xN, yN]</code> or <code>(N, 2)</code> point arrays</li>\n<li><strong><code>circle</code></strong>: Circular masks <code>[x_center, y_center, radius]</code></li>\n</ul>\n<div class=\"highlight highlight-source-python notranslate position-relative overflow-auto\">\n<pre><code><span class=\"pl-k\">import</span> <span class=\"pl-s1\">numpy</span> <span class=\"pl-k\">as</span> <span class=\"pl-s1\">np</span>\n\n<span class=\"pl-c\"># Example with oriented bounding boxes (OBBs)</span>\n<span class=\"pl-s1\">obb_boxes</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">np</span>.<span class=\"pl-c1\">array</span>([\n    [<span class=\"pl-c1\">100</span>, <span class=\"pl-c1\">150</span>, <span class=\"pl-c1\">50</span>, <span class=\"pl-c1\">30</span>, <span class=\"pl-c1\">45</span>],  <span class=\"pl-c\"># Rotated 45 degrees</span>\n    [<span class=\"pl-c1\">200</span>, <span class=\"pl-c1\">200</span>, <span class=\"pl-c1\">60</span>, <span class=\"pl-c1\">40</span>, <span class=\"pl-c1\">90</span>],  <span class=\"pl-c\"># Rotated 90 degrees</span>\n])\n\n<span class=\"pl-s1\">stabilizer</span>.<span class=\"pl-c1\">set_ref_frame</span>(<span class=\"pl-s1\">ref_frame</span>, <span class=\"pl-s1\">obb_boxes</span>, <span class=\"pl-s1\">box_format</span><span class=\"pl-c1\">=</span><span class=\"pl-s\">'xywha'</span>)\n<span class=\"pl-s1\">stabilizer</span>.<span class=\"pl-c1\">stabilize</span>(<span class=\"pl-s1\">cur_frame</span>, <span class=\"pl-s1\">cur_boxes</span>, <span class=\"pl-s1\">box_format</span><span class=\"pl-c1\">=</span><span class=\"pl-s\">'xywha'</span>)\n\n<span class=\"pl-c\"># Transform boxes and get result in different format</span>\n<span class=\"pl-s1\">transformed</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">stabilizer</span>.<span class=\"pl-c1\">transform_cur_boxes</span>(<span class=\"pl-s1\">out_box_format</span><span class=\"pl-c1\">=</span><span class=\"pl-s\">'four'</span>)</code></pre>\n</div>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">Polygon and Circular Mask Examples</h3>\n<a class=\"anchor\" href=\"https://github.com/rfonod/stabilo#polygon-and-circular-mask-examples\"></a></div>\n<div class=\"highlight highlight-source-python notranslate position-relative overflow-auto\">\n<pre><code><span class=\"pl-c\"># Polygon mask(s)</span>\n<span class=\"pl-s1\">polygon_masks</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">np</span>.<span class=\"pl-c1\">array</span>([\n    [<span class=\"pl-c1\">60</span>, <span class=\"pl-c1\">60</span>, <span class=\"pl-c1\">120</span>, <span class=\"pl-c1\">60</span>, <span class=\"pl-c1\">120</span>, <span class=\"pl-c1\">120</span>, <span class=\"pl-c1\">60</span>, <span class=\"pl-c1\">120</span>],\n    [<span class=\"pl-c1\">200</span>, <span class=\"pl-c1\">200</span>, <span class=\"pl-c1\">260</span>, <span class=\"pl-c1\">210</span>, <span class=\"pl-c1\">240</span>, <span class=\"pl-c1\">270</span>, <span class=\"pl-c1\">190</span>, <span class=\"pl-c1\">260</span>],\n])\n<span class=\"pl-s1\">stabilizer</span>.<span class=\"pl-c1\">set_ref_frame</span>(<span class=\"pl-s1\">ref_frame</span>, <span class=\"pl-s1\">polygon_masks</span>, <span class=\"pl-s1\">box_format</span><span class=\"pl-c1\">=</span><span class=\"pl-s\">'polygon'</span>)\n\n<span class=\"pl-c\"># Circular mask(s)</span>\n<span class=\"pl-s1\">circle_masks</span> <span class=\"pl-c1\">=</span> <span class=\"pl-s1\">np</span>.<span class=\"pl-c1\">array</span>([\n    [<span class=\"pl-c1\">120</span>, <span class=\"pl-c1\">120</span>, <span class=\"pl-c1\">25</span>],\n    [<span class=\"pl-c1\">360</span>, <span class=\"pl-c1\">240</span>, <span class=\"pl-c1\">40</span>],\n])\n<span class=\"pl-s1\">stabilizer</span>.<span class=\"pl-c1\">stabilize</span>(<span class=\"pl-s1\">cur_frame</span>, <span class=\"pl-s1\">circle_masks</span>, <span class=\"pl-s1\">box_format</span><span class=\"pl-c1\">=</span><span class=\"pl-s\">'circle'</span>)</code></pre>\n</div>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Documentation</h2>\n<a class=\"anchor\" href=\"https://github.com/rfonod/stabilo#documentation\"></a></div>\n<p>For detailed package documentation, including architecture, end-to-end workflows, mask format specifications, and API behavior notes, see:</p>\n<ul>\n<li><a href=\"https://github.com/rfonod/stabilo/blob/main/docs/usage.md\"><code>docs/usage.md</code></a></li>\n</ul>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Utility Scripts</h2>\n<a class=\"anchor\" href=\"https://github.com/rfonod/stabilo#utility-scripts\"></a></div>\n<p>Utility scripts are provided to demonstrate the functionality of the Stabilo package. These scripts can be found in the <a href=\"https://github.com/rfonod/stabilo/blob/main/scripts\"><code>scripts</code></a> directory and are briefly documented in the <a href=\"https://github.com/rfonod/stabilo/blob/main/scripts/README.md\">scripts README</a>.</p>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">Stabilization Examples</h3>\n<a class=\"anchor\" href=\"https://github.com/rfonod/stabilo#stabilization-examples\"></a></div>\n<ul>\n<li><code>stabilize_video.py</code>: Implements video stabilization relative to a reference frame.</li>\n<li><code>stabilize_boxes.py</code>: Implements object trajectory stabilization relative to a reference frame.</li>\n</ul>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">Threshold Analysis</h3>\n<a class=\"anchor\" href=\"https://github.com/rfonod/stabilo#threshold-analysis\"></a></div>\n<ul>\n<li><code>find_threshold_models.py</code>: Computes regression models between detection thresholds and average keypoint counts for BRISK, KAZE, and AKAZE feature detectors.</li>\n</ul>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Citing This Work</h2>\n<a class=\"anchor\" href=\"https://github.com/rfonod/stabilo#citing-this-work\"></a></div>\n<p>If you use <strong>Stabilo</strong> in your research, software, or product, please cite the following resources appropriately:</p>\n<ol>\n<li>\n<p><strong>Preferred Citation:</strong> Please cite the associated article for any use of the Stabilo package, including research, applications, and derivative work:</p>\n<div class=\"highlight highlight-text-bibtex notranslate position-relative overflow-auto\">\n<pre><code><span class=\"pl-k\">@article</span>{<span class=\"pl-en\">fonod2025advanced</span>,\n  <span class=\"pl-s\">title</span> = <span class=\"pl-s\"><span class=\"pl-pds\">{</span>Advanced computer vision for extracting georeferenced vehicle trajectories from drone imagery<span class=\"pl-pds\">}</span></span>,\n  <span class=\"pl-s\">author</span> = <span class=\"pl-s\"><span class=\"pl-pds\">{</span>Fonod, Robert and Cho, Haechan and Yeo, Hwasoo and Geroliminis, Nikolas<span class=\"pl-pds\">}</span></span>,\n  <span class=\"pl-s\">journal</span> = <span class=\"pl-s\"><span class=\"pl-pds\">{</span>Transportation Research Part C: Emerging Technologies<span class=\"pl-pds\">}</span></span>,\n  <span class=\"pl-s\">volume</span> = <span class=\"pl-s\"><span class=\"pl-pds\">{</span>178<span class=\"pl-pds\">}</span></span>,\n  <span class=\"pl-s\">pages</span> = <span class=\"pl-s\"><span class=\"pl-pds\">{</span>105205<span class=\"pl-pds\">}</span></span>,\n  <span class=\"pl-s\">year</span> = <span class=\"pl-s\"><span class=\"pl-pds\">{</span>2025<span class=\"pl-pds\">}</span></span>,\n  <span class=\"pl-s\">publisher</span> = <span class=\"pl-s\"><span class=\"pl-pds\">{</span>Elsevier<span class=\"pl-pds\">}</span></span>,\n  <span class=\"pl-s\">doi</span> = <span class=\"pl-s\"><span class=\"pl-pds\">{</span>10.1016/j.trc.2025.105205<span class=\"pl-pds\">}</span></span>,\n  <span class=\"pl-s\">url</span> = <span class=\"pl-s\"><span class=\"pl-pds\">{</span>https://doi.org/10.1016/j.trc.2025.105205<span class=\"pl-pds\">}</span></span>\n}</code></pre>\n<div class=\"zeroclipboard-container\">&nbsp;</div>\n</div>\n</li>\n<li>\n<p><strong>Repository Citation:</strong> If you reference, modify, or build upon the Stabilo software itself, please also cite the corresponding Zenodo release:</p>\n<div class=\"highlight highlight-text-bibtex notranslate position-relative overflow-auto\">\n<pre><code><span class=\"pl-k\">@software</span>{<span class=\"pl-en\">fonod2026stabilo</span>,\n  <span class=\"pl-s\">author</span> = <span class=\"pl-s\"><span class=\"pl-pds\">{</span>Fonod, Robert<span class=\"pl-pds\">}</span></span>,\n  <span class=\"pl-s\">license</span> = <span class=\"pl-s\"><span class=\"pl-pds\">{</span>MIT<span class=\"pl-pds\">}</span></span>,\n  <span class=\"pl-s\">month</span> = apr,\n  <span class=\"pl-s\">title</span> = <span class=\"pl-s\"><span class=\"pl-pds\">{</span>Stabilo: A Comprehensive Python Library for Video and Trajectory Stabilization with User-Defined Masks<span class=\"pl-pds\">}</span></span>,\n  <span class=\"pl-s\">url</span> = <span class=\"pl-s\"><span class=\"pl-pds\">{</span>https://github.com/rfonod/stabilo<span class=\"pl-pds\">}</span></span>,\n  <span class=\"pl-s\">doi</span> = <span class=\"pl-s\"><span class=\"pl-pds\">{</span>10.5281/zenodo.12117092<span class=\"pl-pds\">}</span></span>,\n  <span class=\"pl-s\">version</span> = <span class=\"pl-s\"><span class=\"pl-pds\">{</span>1.2.0<span class=\"pl-pds\">}</span></span>,\n  <span class=\"pl-s\">year</span> = <span class=\"pl-s\"><span class=\"pl-pds\">{</span>2026<span class=\"pl-pds\">}</span></span>\n}</code></pre>\n<div class=\"zeroclipboard-container\">&nbsp;</div>\n</div>\n</li>\n</ol>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Contributing</h2>\n<a class=\"anchor\" href=\"https://github.com/rfonod/stabilo#contributing\"></a></div>\n<p>Contributions from the community are welcome! If you encounter any issues or have suggestions for improvements, please open a <a href=\"https://github.com/rfonod/stabilo/issues\">GitHub Issue</a> or submit a pull request.</p>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">License</h2>\n<a class=\"anchor\" href=\"https://github.com/rfonod/stabilo#license\"></a></div>\n<p>This project is distributed under the MIT License. See the <a href=\"https://github.com/rfonod/stabilo/blob/main/LICENSE\">LICENSE</a> file for more details.</p>\n<h2 class=\"heading-element\">Latest Changelog</h2>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/rfonod/stabilo/compare/v1.1.0...v1.2.0\" rel=\"noopener\">https://github.com/rfonod/stabilo/compare/v1.1.0...v1.2.0</a></p>",
    "languages": [
      {
        "id": "eng",
        "title": {
          "en": "English"
        }
      }
    ],
    "publication_date": "2026-05-13",
    "publisher": "Zenodo",
    "related_identifiers": [
      {
        "identifier": "https://github.com/rfonod/stabilo/tree/v1.2.0",
        "relation_type": {
          "id": "issupplementto",
          "title": {
            "de": "Erg\u00e4nzt",
            "en": "Is supplement to"
          }
        },
        "resource_type": {
          "id": "software",
          "title": {
            "de": "Software",
            "en": "Software"
          }
        },
        "scheme": "url"
      },
      {
        "identifier": "https://github.com/rfonod/geo-trax/",
        "relation_type": {
          "id": "isreviewedby",
          "title": {
            "de": "Wird begutachtet von",
            "en": "Is reviewed by"
          }
        },
        "resource_type": {
          "id": "software",
          "title": {
            "de": "Software",
            "en": "Software"
          }
        },
        "scheme": "url"
      },
      {
        "identifier": "arXiv:2411.02136",
        "relation_type": {
          "id": "isdescribedby",
          "title": {
            "de": "Wird beschrieben von",
            "en": "Is described by"
          }
        },
        "resource_type": {
          "id": "publication-preprint",
          "title": {
            "de": "Preprint",
            "en": "Preprint"
          }
        },
        "scheme": "arxiv"
      },
      {
        "identifier": "10.1016/j.trc.2025.105205",
        "relation_type": {
          "id": "isdescribedby",
          "title": {
            "de": "Wird beschrieben von",
            "en": "Is described by"
          }
        },
        "resource_type": {
          "id": "publication-article",
          "title": {
            "de": "Zeitschriftenartikel",
            "en": "Journal article"
          }
        },
        "scheme": "doi"
      },
      {
        "identifier": "https://github.com/rfonod/stabilo-optimize/",
        "relation_type": {
          "id": "isrequiredby",
          "title": {
            "de": "Wird gefordert von",
            "en": "Is required by"
          }
        },
        "resource_type": {
          "id": "software",
          "title": {
            "de": "Software",
            "en": "Software"
          }
        },
        "scheme": "url"
      }
    ],
    "resource_type": {
      "id": "software",
      "title": {
        "de": "Software",
        "en": "Software"
      }
    },
    "rights": [
      {
        "description": {
          "en": "A short and simple permissive license with conditions only requiring preservation of copyright and license notices. Licensed works, modifications, and larger works may be distributed under different terms and without source code."
        },
        "id": "mit",
        "props": {
          "scheme": "spdx",
          "url": "https://opensource.org/licenses/MIT"
        },
        "title": {
          "en": "MIT License"
        }
      }
    ],
    "subjects": [
      {
        "subject": "RANSAC"
      },
      {
        "subject": "Homography Estimation"
      },
      {
        "subject": "Feature Matching"
      },
      {
        "subject": "Video Stabilization"
      },
      {
        "subject": "Python"
      },
      {
        "subject": "OpenCV"
      },
      {
        "subject": "Image Registration"
      },
      {
        "subject": "Feature Extraction"
      },
      {
        "subject": "Video Processing"
      },
      {
        "subject": "Image Processing"
      },
      {
        "id": "euroscivoc:935",
        "identifiers": [
          {
            "identifier": "http://data.europa.eu/8mn/euroscivoc/c3f7741c-652b-44cc-9062-491fc41aed2f",
            "scheme": "url"
          }
        ],
        "props": {
          "parents": "euroscivoc:23,euroscivoc:47,euroscivoc:297"
        },
        "scheme": "EuroSciVoc",
        "subject": "Computer vision"
      },
      {
        "subject": "Stabilization"
      },
      {
        "subject": "Reference Frame"
      },
      {
        "subject": "Frame Alignment"
      }
    ],
    "title": "Stabilo: A Comprehensive Python Library for Video and Trajectory Stabilization with User-Defined Masks",
    "version": "v1.2.0"
  },
  "parent": {
    "access": {
      "owned_by": {
        "user": "305396"
      },
      "settings": {
        "accept_conditions_text": null,
        "allow_guest_requests": false,
        "allow_user_requests": false,
        "secret_link_expiration": 0
      }
    },
    "communities": {
      "default": "3c1383da-d7ab-4167-8f12-4d8aa0cc637f",
      "entries": [
        {
          "access": {
            "member_policy": "open",
            "members_visibility": "public",
            "record_submission_policy": "open",
            "review_policy": "closed",
            "visibility": "public"
          },
          "children": {
            "allow": false
          },
          "created": "2013-10-17T09:43:15+00:00",
          "custom_fields": {},
          "deletion_status": {
            "is_deleted": false,
            "status": "P"
          },
          "id": "3c1383da-d7ab-4167-8f12-4d8aa0cc637f",
          "links": {},
          "metadata": {
            "curation_policy": "<p>The <em><strong>MUST</strong> </em>criteria are required in order to accept a work into the EPFL community.</p>\n<p>References to works accepted in the EPFL Community will be imported on <a href=\"https://infoscience.epfl.ch/\" target=\"_top\">Infoscience</a> for improved visibility. If allowed by the license, openly accessible works related to publications will be archived in the EPFL Academic Output Archive,&nbsp;<a href=\"https://go.epfl.ch/acoua\" target=\"_top\">ACOUA</a>.</p>\n<p><em><strong>MUST</strong></em></p>\n<p>M1. At least one author is affiliated with EPFL at the time of the submission or creation of the submitted work.</p>\n<p>M2. Contact information for at least one EPFL author is provided, preferably through an ORCID identifier.</p>\n<p>M3. The content of the submitted work must be accessible for review, i.e. Open Access, or Restricted after an access request has been granted to the reviewers. Embargoed works will be reviewed after the embargo expires.</p>\n<p>M4. The Description of the submitted work is sufficiently detailed. Mere references to external articles or to other external resources are not sufficient descriptions.</p>\n<p>M5. The submitted work includes a clearly identifiable README file, typically in the root directory. This is not required for works consisting in one single document (ex. publication, poster, or presentation).</p>\n<p>M6. The main DOI has been assigned by Zenodo. Entering an existing DOI as the main identifier is allowed only if the submitted work is an exact copy of a digital object that has already received its DOI on another platform. For example, supplementary data to a journal article should NOT re-use the journal article DOI.</p>\n<p><em><strong>RECOMMENDED</strong></em></p>\n<p>R1. All authors are identified by their ORCID.</p>\n<p>R2. The main title is human-readable on the same level as conventional publications: filenames or coded expressions are deprecated.</p>\n<p>R3. If existing, references to related publications (e.g., article, source code, other datasets, etc.) are specified in the \"Related works\" field. If available, references are designated by their respective DOIs.</p>\n<p>R4. If related grants require an acknowledgement, they are listed using &ldquo;Funding/Grants&rdquo; fields.</p>\n<p>R5. Any personal and sensitive data has been anonymized.</p>\n<p><em><strong>NICE TO HAVE</strong></em></p>\n<p>N1. The submitted work has been cleaned up (e.g., there are no temporary files, no unnecessary empty files or folders, no superfluous file versions, etc.).</p>\n<p>N2. Permissive licenses are preferred. CC0, CC-BY-4.0, CC-BY-SA-4.0 for data and MIT, BSD, GPL for code are suggested.</p>\n<p>N3. The README file contains <a href=\"https://infoscience.epfl.ch/record/298249\">detailed information</a> about the work creation (authors, time, place, methodologies&hellip;), content (file organization and naming, formats, relevant standards&hellip;), sharing and access, etc.</p>\n<p>N4. If the submission is related to a PhD thesis, the supervisor is specified.</p>\n<p>N5. Files are available in open formats. If proprietary formats are present, the work also includes versions of the files converted to open formats, with the least possible loss of information.</p>\n<p>N6. Where applicable, sources from which the work is derived are specified in the &ldquo;References&rdquo; field.</p>\n<p>N7. Keywords are entered as separated fields in the &ldquo;Keywords and subjects&rdquo; field.</p>",
            "description": "Research data, code, other resources and academic output shared by EPFL members.",
            "organizations": [
              {
                "id": "02s376052"
              }
            ],
            "page": "<h2><strong>DESCRIPTION</strong></h2>\n<p>Research data, code, other resources and academic output shared by EPFL members.</p>\n<p>The aim of the EPFL Community on Zenodo is to strengthen the visibility and re-usability of the datasets produced by EPFL researchers, and to facilitate the dissemination of information (links between publications and data; potential re-use by other researchers; reporting for scientific grants; etc.). This community was created to showcase datasets and software, but any upload type can be submitted. However, we generally recommend EPFL&rsquo;s institutional repository <a href=\"https://infoscience.epfl.ch/\">Infoscience</a> instead of Zenodo for the following types: Publication, Poster, Presentation and Lesson.</p>\n<p>For support with your upload and curation, or for any questions about this community, please contact the RDM team of EPFL Library at <a href=\"mailto:researchdata@epfl.ch\">researchdata@epfl.ch</a>.</p>\n<h2><strong>CURATION POLICY</strong></h2>\n<p>The&nbsp;<em><strong>MUST</strong> </em>criteria are required to accept a work into the EPFL community.</p>\n<p>References to works accepted in the EPFL Community will be imported on <a href=\"https://infoscience.epfl.ch/\" target=\"_top\">Infoscience</a> for improved visibility. If allowed by the license, openly accessible works related to publications will be archived in the EPFL Academic Output Archive,&nbsp;<a href=\"https://go.epfl.ch/acoua\" target=\"_top\">ACOUA</a>.</p>\n<p><em><strong>MUST</strong></em></p>\n<p>M1. At least one author is affiliated with EPFL at the time of the submission or creation of the submitted work.</p>\n<p>M2. Contact information for at least one EPFL author is provided, preferably through an ORCID identifier.</p>\n<p>M3. The content of the submitted work must be accessible for review, i.e. Open Access, or Restricted after an access request has been granted to the reviewers. Embargoed works will be reviewed after the embargo expires.</p>\n<p>M4. The Description of the submitted work is sufficiently detailed. Mere references to external articles or to other external resources are not sufficient descriptions.</p>\n<p>M5. The submitted work includes a clearly identifiable README file, typically in the root directory. This is not required for works consisting in one single document (ex. publication, poster, or presentation).</p>\n<p>M6. The main DOI has been assigned by Zenodo. Entering an existing DOI as the main identifier is allowed only if the submitted work is an exact copy of a digital object that has already received its DOI on another platform. For example, supplementary data to a journal article should NOT re-use the journal article DOI.</p>\n<p><em><strong>RECOMMENDED</strong></em></p>\n<p>R1. All authors are identified by their ORCID.</p>\n<p>R2. The main title is human-readable on the same level as conventional publications: filenames or coded expressions are deprecated.</p>\n<p>R3. If existing, references to related publications (e.g., article, source code, other datasets, etc.) are specified in the \"Related works\" field. If available, references are designated by their respective DOIs.</p>\n<p>R4. If related grants require an acknowledgement, they are listed using &ldquo;Funding/Grants&rdquo; fields.</p>\n<p>R5. Any personal and sensitive data has been anonymized.</p>\n<p><em><strong>NICE TO HAVE</strong></em></p>\n<p>N1. The submitted work has been cleaned up (e.g., there are no temporary files, no unnecessary empty files or folders, no superfluous file versions, etc.).</p>\n<p>N2. Permissive licenses are preferred. CC0, CC-BY-4.0, CC-BY-SA-4.0 for data and MIT, BSD, GPL for code are suggested.</p>\n<p>N3. The README file contains <a href=\"https://infoscience.epfl.ch/record/298249\">detailed information</a> about the work creation (authors, time, place, methodologies&hellip;), content (file organization and naming, formats, relevant standards&hellip;), sharing and access, etc.</p>\n<p>N4. If the submission is related to a PhD thesis, the supervisor is specified.</p>\n<p>N5. Files are available in open formats. If proprietary formats are present, the work also includes versions of the files converted to open formats, with the least possible loss of information.</p>\n<p>N6. Where applicable, sources from which the work is derived are specified in the &ldquo;References&rdquo; field.</p>\n<p>N7. Keywords are entered as separated fields in the &ldquo;Keywords and subjects&rdquo; field.</p>\n<h2><strong>REVIEW PROCESS</strong></h2>\n<p>Once the curator receives a notification email of a submission, the submission is reviewed against the quality criteria listed in the Curation policy.</p>\n<p>If some criteria are not met, the Curator will contact the authors and suggest appropriate modifications. Depending on the importance of the missing criterion, the curator will proceed as follows:</p>\n<ul>\n<li><strong><em>MUST</em></strong>: the upload will not be accepted into the EPFL community unless the authors address the issue satisfactorily.</li>\n<li><strong><em>RECOMMENDED</em></strong>: the upload will be accepted into the EPFL community, but the authors will be asked to address the issues. The curator will actively seek confirmation of the outcome.</li>\n<li><strong><em>NICE TO HAVE</em></strong>: the upload will be accepted into the EPFL community. The authors will be informed of the recommendation.</li>\n</ul>",
            "title": "EPFL - \u00c9cole Polytechnique F\u00e9d\u00e9rale de Lausanne",
            "website": "https://go.epfl.ch/rdm"
          },
          "revision_id": 11,
          "slug": "epfl",
          "updated": "2026-02-11T09:38:37.890389+00:00"
        }
      ],
      "ids": [
        "3c1383da-d7ab-4167-8f12-4d8aa0cc637f"
      ]
    },
    "id": "12117092",
    "pids": {
      "doi": {
        "client": "datacite",
        "identifier": "10.5281/zenodo.12117092",
        "provider": "datacite"
      }
    }
  },
  "pids": {
    "doi": {
      "client": "datacite",
      "identifier": "10.5281/zenodo.20171951",
      "provider": "datacite"
    },
    "oai": {
      "identifier": "oai:zenodo.org:20171951",
      "provider": "oai"
    }
  },
  "revision_id": 6,
  "stats": {
    "all_versions": {
      "data_volume": 19660804137.0,
      "downloads": 157,
      "unique_downloads": 156,
      "unique_views": 1372,
      "views": 1495
    },
    "this_version": {
      "data_volume": 0.0,
      "downloads": 0,
      "unique_downloads": 0,
      "unique_views": 45,
      "views": 50
    }
  },
  "status": "published",
  "swh": {},
  "updated": "2026-05-13T21:29:54.066866+00:00",
  "versions": {
    "index": 5,
    "is_latest": true
  }
}