A collection of small but useful tools for scientific publications and projects
Project description
vibing
A collection of small but useful tools for scientific publications and projects.
Modules
| Module | Description |
|---|---|
calibration |
Detect lens distortion using charuco boards |
sleap_convert |
Convert SLEAP predictions to ROI polygons |
geometry |
Pixel↔cm conversion, depth from boundaries |
pose |
Interpolate tracking gaps, body hulls, region checks |
Standalone Tools
These functions work independently for common tasks:
| Function | What it does | Example use case |
|---|---|---|
geometry.PixelScale |
Convert pixels ↔ real units (cm/mm) | "My ruler is 500px = 10cm, convert all measurements" |
geometry.depth_from_boundary |
How far a point is inside a region | "How deep is the snout in the arm?" |
pose.interpolate_gaps |
Fill short gaps in tracking data | "SLEAP lost tracking for 3 frames, fill it in" |
pose.body_hull |
Convex hull from body keypoints | "What's the body footprint polygon?" |
pose.body_hull_coverage |
% of body inside a region | "What fraction of the mouse is in zone A?" |
calibration.check_video |
Measure lens distortion | "Does this GoPro video need undistortion?" |
Installation
From PyPI (recommended)
# Using uv
uv pip install vibing
# Using pip
pip install vibing
# With optional dependencies
uv pip install "vibing[calibration]" # Camera calibration tools (opencv)
uv pip install "vibing[sleap]" # SLEAP conversion tools
uv pip install "vibing[geometry]" # Geometry and pose tools (shapely)
uv pip install "vibing[all]" # Everything
Run CLI without installing (uvx)
# Run distortion checker directly
uvx --from "vibing[calibration]" vibing-distortion-check video.mp4
# Or install as a tool
uv tool install "vibing[calibration]"
vibing-distortion-check video.mp4
From GitHub
# Install from git
uv pip install "git+https://github.com/LeoMeow123/vibes.git[calibration]"
# Run without installing
uv tool run --from "git+https://github.com/LeoMeow123/vibes.git[calibration]" vibing-distortion-check video.mp4
From source
git clone https://github.com/LeoMeow123/vibes.git
cd vibes
uv pip install -e ".[all]"
Tools
Calibration (vibing.calibration)
Camera calibration and distortion analysis tools.
check_video- Analyze video for lens distortion using charuco boardcheck_image- Analyze single image for distortioncheck_batch- Batch process directory of videosCharucoBoardConfig- Configure charuco board parametersDistortionMetrics- Distortion analysis results
CLI: vibing-distortion-check
# Check single video
vibing-distortion-check video.mp4
# Batch process directory
vibing-distortion-check /path/to/videos --batch --output-csv results.csv
# Custom board configuration
vibing-distortion-check video.mp4 --squares-x 10 --squares-y 7
Undistortion (vibing.undistortion)
Video undistortion and perspective correction pipelines using OpenCV.
- spacecage-undistort - Fisheye lens distortion correction for NASA SpaceCage experiments with ROI-based calibration and SLEAP coordinate transformation
- tmaze-undistort - T-maze video processing with lens distortion removal and perspective transformation to top-down views using labeled ROIs and known physical dimensions
SLEAP Convert (vibing.sleap_convert)
Convert SLEAP predictions to ROI polygon YAML format.
slp_to_roi_yaml- Convert single SLP file to ROI YAMLconvert_batch- Batch convert directory of SLP filesextract_keypoints- Extract keypoints from SLP (low-level)ROITemplate- Define custom polygon templates for any arena
CLI: vibing-slp-to-yaml
# Convert single file
vibing-slp-to-yaml predictions.slp -o output.yml
# Batch convert directory
vibing-slp-to-yaml /path/to/slps --batch -o /path/to/yamls
# List available templates
vibing-slp-to-yaml --list-templates
Built-in templates: tmaze_horizontal (7-region T-maze with corner sharing)
Geometry (vibing.geometry)
Spatial analysis and unit conversion utilities.
Pixel-to-real conversion:
PixelScale- Convert between pixels and real units (cm, mm, etc.)px_to_real- Quick one-off conversioncompute_scale- Create scale from two reference points
Depth/distance:
depth_from_boundary- Calculate penetration depth into a regionsigned_distance- Signed distance to polygon (negative = inside)
from vibing.geometry import PixelScale, depth_from_boundary
from shapely.geometry import box
# Pixel to cm conversion: ruler is 500px = 10cm
scale = PixelScale.from_reference(pixels=500, real_distance=10, unit="cm")
print(scale.to_real(250)) # 5.0 cm
print(scale.to_real_area(2500)) # 1.0 cm²
# Or from two labeled points
scale = PixelScale.from_two_points((100, 100), (600, 100), real_distance=20, unit="cm")
# Depth from boundary
region = box(0, 0, 100, 100)
depth = depth_from_boundary((50, 50), region) # 50.0 (distance to nearest edge)
Pose (vibing.pose)
Tools for analyzing pose estimation data from SLEAP or similar trackers.
Region checking:
bodypart_in_region- Check if keypoint is inside polygonbodyparts_in_region- Batch check multiple keypointscheck_bodyparts_by_name- Check named body parts (e.g., "at least one hindpaw")count_bodyparts_in_region- Count keypoints inside region
Track interpolation:
interpolate_gaps- Fill short gaps in single keypoint trackinterpolate_track- Interpolate all keypoints in (T, J, 2) arraycount_gaps- Quality control: count and characterize gaps
Body hull:
body_hull- Convex hull from body keypoints (Polygon or vertices)body_hull_area- Calculate hull areabody_hull_centroid- Get hull center pointbody_hull_series- Compute hull for each frame in a trackbody_hull_coverage- Percentage of hull overlapping with ROI
from vibing.pose import interpolate_gaps, body_hull, body_hull_coverage
from shapely.geometry import box
import numpy as np
# Interpolate short gaps in tracking data
track = np.array([[0, 0], [np.nan, np.nan], [2, 2], [3, 3]])
result = interpolate_gaps(track, max_gap=7) # Gap filled: [1, 1]
# Compute body hull from keypoints
points = np.array([[0, 0], [10, 0], [10, 10], [0, 10]])
hull = body_hull(points) # Shapely Polygon
print(hull.area) # 100.0
# Calculate coverage in region
region = box(0, 0, 50, 50)
pct = body_hull_coverage(points, region) # 25.0%
Quick Start
import numpy as np
from vibing.geometry import PixelScale
from vibing.pose import interpolate_gaps, body_hull
# Convert pixels to cm using a reference measurement
scale = PixelScale.from_reference(pixels=500, real_distance=10, unit="cm")
print(scale.to_real(250)) # 5.0 cm
# Fill short gaps in tracking data
track = np.array([[0, 0], [np.nan, np.nan], [2, 2], [3, 3]])
filled = interpolate_gaps(track, max_gap=7)
print(filled[1]) # [1., 1.] - gap interpolated
# Compute body footprint from keypoints
points = np.array([[0, 0], [10, 0], [10, 10], [0, 10]])
hull = body_hull(points)
print(hull.area) # 100.0
Development
# Clone and install in dev mode
git clone https://github.com/LeoMeow123/vibes.git
cd vibes
uv pip install -e ".[dev]"
# Run tests
pytest
# Run linter
ruff check src/
License
MIT License
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file vibing-0.3.1.tar.gz.
File metadata
- Download URL: vibing-0.3.1.tar.gz
- Upload date:
- Size: 27.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
806c1ced39bfe92ff354edb4568fce1fc0a5d252ee1ba36bb328ccccedbaa401
|
|
| MD5 |
39c8c519c8dfa3a1cb8b17a341e140a3
|
|
| BLAKE2b-256 |
492a6e81f060d1440098230ed43d882c9519b760772bec1a8b57eff3106d2583
|
Provenance
The following attestation bundles were made for vibing-0.3.1.tar.gz:
Publisher:
publish.yml on LeoMeow123/vibes
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vibing-0.3.1.tar.gz -
Subject digest:
806c1ced39bfe92ff354edb4568fce1fc0a5d252ee1ba36bb328ccccedbaa401 - Sigstore transparency entry: 811167860
- Sigstore integration time:
-
Permalink:
LeoMeow123/vibes@761c9496eb780b33752f996392139e7a992a240c -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/LeoMeow123
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@761c9496eb780b33752f996392139e7a992a240c -
Trigger Event:
push
-
Statement type:
File details
Details for the file vibing-0.3.1-py3-none-any.whl.
File metadata
- Download URL: vibing-0.3.1-py3-none-any.whl
- Upload date:
- Size: 33.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bc3f429c68d09604ef948b6b7d9f91950a5523c834a0281a9680453de94bd1f3
|
|
| MD5 |
be382786748b1718297dfe17883b690e
|
|
| BLAKE2b-256 |
76e8aa25dcaba21fd34775b805f05dfed3e936f378fc13efce796cac939a3594
|
Provenance
The following attestation bundles were made for vibing-0.3.1-py3-none-any.whl:
Publisher:
publish.yml on LeoMeow123/vibes
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vibing-0.3.1-py3-none-any.whl -
Subject digest:
bc3f429c68d09604ef948b6b7d9f91950a5523c834a0281a9680453de94bd1f3 - Sigstore transparency entry: 811167914
- Sigstore integration time:
-
Permalink:
LeoMeow123/vibes@761c9496eb780b33752f996392139e7a992a240c -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/LeoMeow123
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@761c9496eb780b33752f996392139e7a992a240c -
Trigger Event:
push
-
Statement type: