Skip to content

Commit 08a1a06

Browse files
committed
docs: rewrite README and landing page for 5-camera demo
Rewrite README.md with feature table and aniposelib export mention. Rewrite docs/index.md with calibration problem framing and bold-labeled feature list. Fix broken anchor in extrinsic_calibration.md. Simplify mkdocs.yml nav structure.
1 parent a3af47b commit 08a1a06

File tree

4 files changed

+77
-51
lines changed

4 files changed

+77
-51
lines changed

README.md

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@
1212
![pytest](https://github.com/mprib/caliscope/actions/workflows/pytest.yml/badge.svg)
1313
</div>
1414

15-
Caliscope is a permissively licensed multicamera calibration tool for markerless motion capture workflows. It allows visual assessment and detailed quality metrics at each stage of the calibration workflow to allow high quality output. The approach to initializing parameters for bundle adjustment allows rapid and reliable calibration.
15+
Caliscope is a permissively licensed multicamera calibration tool.
16+
Bundle adjustment across 3+ cameras requires a good initial estimate of camera positions to converge quickly and reliably.
17+
Caliscope is designed to produce that good initial estimate and rapidly solve for a quality calibration.
1618

1719
## Demo
1820

19-
https://github.com/user-attachments/assets/037c6237-0955-41e2-979e-a4247f7677e6
21+
https://github.com/user-attachments/assets/b8bb78de-866e-4ba2-b5c7-674e3a33dd9e
2022

2123
## Quick Start
2224

@@ -28,34 +30,33 @@ For a walkthrough with test data after installing, see the [sample project](http
2830

2931
## Features
3032

31-
#### Calibration
33+
| Feature | What it does |
34+
|---------|-------------|
35+
| Pairwise PnP initialization | Estimates camera positions from stereopairs chained transitively, so bundle adjustment starts from a reliable point |
36+
| Flexible calibration targets | ChArUco, ArUco, and chessboard targets; a single ArUco marker on a sheet of paper can calibrate a wide volume |
37+
| Mirror board support | A charuco board printed on both sides of a rigid surface links cameras that never share a common view |
38+
| Visual feedback | Inspect distortion models, 3D camera positions, reprojection errors, and world scale accuracy at each stage |
39+
| Outlier filtering | Filter calibration points by reprojection error after optimization and re-solve |
40+
| Aniposelib export | Automatically generates `camera_array_aniposelib.toml` for use with [aniposelib](https://github.com/lambdaloop/aniposelib)-compatible tools |
3241

33-
- ChArUco, ArUco, and chessboard calibration targets
34-
- Automated intrinsic calibration from video with distortion model visualization
35-
- Pairwise extrinsic initialization for reliable bundle adjustment across 3+ cameras
36-
- Mirror board support for camera arrangements where no single board position is visible to all cameras
37-
- 3D visualizer for inspecting camera positions and setting the world origin
38-
- Reprojection error display and outlier filtering after optimization
39-
- Exports `camera_array.toml` (native) and `camera_array_aniposelib.toml` for use with [aniposelib](https://github.com/lambdaloop/aniposelib)-compatible tools
42+
## Tracking and Reconstruction
4043

41-
#### Tracking and Reconstruction
42-
43-
- Built-in MediaPipe trackers (Hands, Pose, Holistic)
44-
- ONNX model support with built-in RTMPose model cards and in-app weight download; also compatible with custom models from SLEAP, DeepLabCut, and other frameworks
45-
- Output in CSV and TRC (OpenSim) formats
44+
Caliscope includes a basic reconstruction pipeline for verifying calibration quality.
45+
You can load ONNX pose estimation models (RTMPose, SLEAP, DeepLabCut, or custom) and export 3D trajectories in CSV and TRC (OpenSim) formats.
46+
For more complete reconstruction workflows, tools like [anipose](https://anipose.readthedocs.io/) and [Pose2Sim](https://github.com/perfanalytics/pose2sim) will serve you better.
47+
The aniposelib-compatible export makes it straightforward to use Caliscope for calibration and hand off to these tools for downstream processing.
4648

4749
## Community & Support
4850

49-
To report a bug or request a feature, please [open an issue](https://github.com/mprib/caliscope/issues). For questions, post in [Discussions](https://github.com/mprib/caliscope/discussions). This is an open-source project supported by volunteer effort.
51+
To report a bug or request a feature, please [open an issue](https://github.com/mprib/caliscope/issues).
52+
For questions, post in [Discussions](https://github.com/mprib/caliscope/discussions).
5053

5154
## Acknowledgments
5255

53-
This project was inspired by [FreeMoCap](https://github.com/freemocap/freemocap) (FMC), which is spearheaded by [Jon Matthis, PhD](https://jonmatthis.com/) of the HuMoN Research Lab.
54-
The FMC calibration and triangulation system is built upon [Anipose](https://github.com/lambdaloop/anipose), created by Lili Karushchek, PhD.
55-
Caliscope was originally envisioned as an alternative calibration tool to Anipose that would allow more granular estimation and visual feedback.
56-
Several lines of the original Anipose triangulation code are used in this code base, though it was otherwise written from the ground up.
56+
Caliscope was inspired by [anipose](https://github.com/lambdaloop/anipose), created by Lili Karashchuk, PhD, which demonstrated the value of accessible multicamera calibration for the research community.
57+
Several lines of the original anipose triangulation code are used in this code base.
5758

5859
## License
5960

60-
Caliscope is licensed under the permissive [BSD 2-Clause license](https://opensource.org/license/bsd-2-clause/).
61-
The triangulation function was adapted from the [Anipose](https://github.com/lambdaloop/anipose) code base which is also licensed under the BSD-2 Clause.
61+
Caliscope is licensed under the [BSD 2-Clause license](https://opensource.org/license/bsd-2-clause/).
62+
The triangulation function was adapted from [anipose](https://github.com/lambdaloop/anipose), also licensed under BSD-2-Clause.

docs/extrinsic_calibration.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ See [Calibration Targets](calibration_targets.md) for detailed information on ea
1717

1818
### 1. Recording and File Setup
1919

20-
Save synchronized videos to `project_root/calibration/extrinsic/` according to the naming convention outlined in [Project Setup](project_setup.md#stage-2-extrinsic-calibration). Ensure videos were synchronized during recording, or provide a [`timestamps.csv`](project_setup.md#timestampscsv) file for post-hoc synchronization.
20+
Save synchronized videos to `project_root/calibration/extrinsic/` according to the naming convention outlined in [Project Setup](project_setup.md#stage-2-extrinsic-calibration). Ensure videos were synchronized during recording, or provide a [`timestamps.csv`](project_setup.md#timestampscsv-format) file for post-hoc synchronization.
2121

2222
### 2. Extraction
2323

docs/index.md

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,62 @@
11
# Caliscope
22

3-
Caliscope is an open-source multicamera calibration tool. It produces the intrinsic and extrinsic camera parameters that downstream tools need for 3D reconstruction, whether you are tracking animal behavior with [SLEAP](https://sleap.ai/) or [DeepLabCut](https://www.mackenziemathislab.org/deeplabcut), feeding calibration into an [anipose](https://anipose.readthedocs.io/) pipeline, running biomechanical analysis with [Pose2Sim](https://github.com/perfanalytics/pose2sim), or building something else entirely. If you need help fitting Caliscope into your pipeline, please [open a discussion](https://github.com/mprib/caliscope/discussions).
3+
Caliscope is a permissively licensed multicamera calibration tool.
4+
It produces the intrinsic and extrinsic camera parameters that downstream tools need for 3D reconstruction.
5+
The objective of this project is to **Do One Thing Well**, and that one thing is estimating camera parameters.
6+
7+
If you sense that there *must* be a good way to calibrate your setup but existing tools don't quite cut it, please [open a discussion](https://github.com/mprib/caliscope/discussions).
8+
I (mprib) am interested in exploring whether Caliscope can be upgraded to accommodate your use case.
49

510
## The calibration problem
611

7-
Multicamera 3D reconstruction requires knowing each camera's optical properties (intrinsic calibration) and its position and orientation in space (extrinsic calibration). Getting these parameters right is the foundation of accurate triangulation. Getting them wrong produces errors that propagate silently through every downstream analysis.
12+
Multicamera 3D reconstruction requires knowing each camera's optical properties (intrinsic calibration) and its position and orientation in space (extrinsic calibration).
13+
Getting these parameters right is the foundation of accurate triangulation.
14+
Getting them wrong produces errors that propagate silently through every downstream analysis.
15+
Calibrating more than two cameras requires bundle adjustment, a nonlinear optimization that simultaneously refines all camera positions and 3D point estimates.
16+
Bundle adjustment is powerful but sensitive to its starting point: a poor initial estimate can cause it to converge to a poor solution or fail entirely.
17+
When the initial estimate is good, bundle adjustment converges quickly and reliably.
18+
Caliscope is designed to produce that good initial estimate and rapidly solve for a quality calibration. Some important strategies that facilitate this:
19+
20+
- **Pairwise PnP initialization:**
21+
Caliscope builds an initial estimate of camera positions from pairwise relationships using PnP (Perspective-n-Point).
22+
For each pair of cameras that both see the calibration target in the same frame, it estimates their relative position.
23+
It then chains these pairwise estimates transitively: if the relationship between cameras A and B is known, and B to C is known, A to C can be inferred.
24+
This produces a reliable starting point, even when no single position of the target is visible to all cameras at once.
825

9-
OpenCV provides functions for stereo calibration between two cameras, but most practical setups benefit from three or more. Additional viewpoints reduce occlusion and improve triangulation accuracy. Calibrating more than two cameras requires bundle adjustment, a nonlinear optimization that simultaneously refines all camera positions and 3D point estimates. Bundle adjustment is powerful but sensitive to its starting point: a poor initial estimate can cause it to converge to a wrong solution or fail entirely.
26+
- **Flexible targets:**
27+
The PnP approach allows a single ArUco marker printed on a standard sheet of paper to serve as the extrinsic calibration target.
28+
Large-format prints are visible from greater distances, making it practical to calibrate wide capture volumes.
1029

11-
Caliscope addresses this by building an initial estimate from pairwise relationships. For each pair of cameras that both see the calibration target in the same frame, it estimates their relative position using PnP (Perspective-n-Point) estimation, a general technique that does not depend on OpenCV's stereo calibration. It then chains these pairwise estimates together transitively: if the relationship between cameras A and B is known, and B to C is known, A to C can be inferred. This produces a rough but reliable starting point for bundle adjustment, even when no single position of the target is visible to all cameras at once.
30+
- **Mirror boards:**
31+
For setups where cameras face inward from all directions (common in animal behavior rigs and dense multicamera arrays), finding board positions visible to every camera can be difficult.
32+
Caliscope supports a charuco board printed on both sides of a rigid surface (mirror image on back), so cameras viewing opposite sides identify the same physical point from either direction.
33+
**This allows cameras to be linked via PnP even if they never share a common view of the board.**
1234

13-
This pairwise approach also opens up flexibility in calibration targets. A single ArUco marker printed on a standard sheet of paper can serve as the extrinsic target. Large-format prints are visible from greater distances, making it practical to calibrate wide capture volumes. For setups where cameras face inward from all directions (common in animal behavior rigs and dense multicamera arrays), finding board positions visible to every camera can be difficult. Caliscope supports mirror boards: a calibration pattern printed on both sides of a rigid surface, so cameras viewing opposite sides identify the same physical point from either direction. This enables calibration of camera arrangements that would be difficult to handle with existing tools.
35+
- **Visual feedback:**
36+
During intrinsic calibration, you can inspect the fitted distortion model to catch problems early.
37+
During extrinsic calibration, you can see a 3D representation of the cameras along with the calibration points moving through space.
38+
World scale accuracy is visualized across frames based on the distances between target calibration points at each frame.
1439

15-
The GUI provides feedback throughout the process. During intrinsic calibration, you can inspect the fitted distortion model to catch problems early. During extrinsic calibration, you can see reprojection errors after bundle adjustment, filter outliers, and verify scale accuracy against the known geometry of your calibration target.
1640

1741
## Integration with other tools
1842

19-
Caliscope's primary output is a calibrated camera array: intrinsic parameters (focal length, distortion) and extrinsic parameters (position and orientation) for every camera in your system. Alongside the native `camera_array.toml`, Caliscope automatically exports `camera_array_aniposelib.toml` in the format used by [aniposelib](https://github.com/lambdaloop/aniposelib). Tools that consume aniposelib calibrations can use this file directly.
43+
Caliscope's primary output is a calibrated camera array: intrinsic parameters (focal length, distortion) and extrinsic parameters (position and orientation) for every camera in your system.
44+
Alongside the native `camera_array.toml`, Caliscope automatically exports `camera_array_aniposelib.toml` in the format used by [aniposelib](https://github.com/lambdaloop/aniposelib).
45+
Tools that consume aniposelib calibrations can use this file directly.
2046

2147
## Tracking and triangulation
2248

23-
Caliscope includes a basic reconstruction pipeline that tracks 2D landmarks and triangulates them into 3D trajectories. You can load custom ONNX pose estimation models exported from SLEAP, DeepLabCut, RTMPose, or other frameworks. Built-in MediaPipe trackers are included for convenience. Output is available in CSV and TRC (OpenSim) formats. Signal processing (gap filling, smoothing, filtering) and biomechanical modeling are outside the current scope.
24-
25-
## Acknowledgments
26-
27-
Caliscope was inspired by [anipose](https://anipose.readthedocs.io/), which demonstrated the value of accessible multicamera calibration for the research community. Caliscope focuses on providing GUI feedback to identify problems in the calibration process and on using granular parameter initialization to improve the likelihood of calibration success.
49+
Caliscope includes a basic reconstruction pipeline that tracks 2D landmarks and triangulates them into 3D trajectories.
50+
You can load custom ONNX pose estimation models exported from SLEAP, DeepLabCut, RTMPose, or other frameworks.
51+
Output is available in CSV and TRC (OpenSim) formats.
52+
For more complete reconstruction workflows, tools like [anipose](https://anipose.readthedocs.io/) and [Pose2Sim](https://github.com/perfanalytics/pose2sim) will serve you better.
53+
Caliscope's aniposelib-compatible export (see above) makes it straightforward to use Caliscope for calibration and hand off to these tools for downstream processing.
2854

2955
## Getting started
3056

31-
The [Installation](installation.md) guide covers setup. [Project Setup](project_setup.md) explains the workspace directory structure and file naming conventions. A [sample project](sample_project.md) with downloadable data demonstrates the full pipeline.
57+
The [Installation](installation.md) guide covers setup.
58+
[Project Setup](project_setup.md) explains the workspace directory structure and file naming conventions.
59+
A [sample project](sample_project.md) with downloadable data demonstrates the full pipeline.
3260

33-
If you encounter a bug or have a feature request, please [open an issue](https://github.com/mprib/caliscope/issues). For questions, post in [Discussions](https://github.com/mprib/caliscope/discussions).
61+
If you encounter a bug or have a feature request, please [open an issue](https://github.com/mprib/caliscope/issues).
62+
For questions, post in [Discussions](https://github.com/mprib/caliscope/discussions).

mkdocs.yml

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ theme:
99
favicon: images/box3d-center.svg
1010
name: material
1111
font:
12-
text: 'Roboto'
13-
code: 'Roboto Mono'
12+
text: "Roboto"
13+
code: "Roboto Mono"
1414
language: en
1515
palette:
1616
- media: "(prefers-color-scheme: light)"
@@ -28,21 +28,19 @@ theme:
2828
primary: blue
2929
accent: green
3030

31-
3231
nav:
3332
- Home: index.md
3433
- Installation: installation.md
3534
- Getting Started:
36-
- Project Setup: project_setup.md
37-
- Sample Project: sample_project.md
35+
- Project Setup: project_setup.md
36+
- Sample Project: sample_project.md
3837
- Calibration:
39-
- Calibration Targets: calibration_targets.md
40-
- Intrinsic Calibration: intrinsic_calibration.md
41-
- Extrinsic Calibration: extrinsic_calibration.md
38+
- Calibration Targets: calibration_targets.md
39+
- Intrinsic Calibration: intrinsic_calibration.md
40+
- Extrinsic Calibration: extrinsic_calibration.md
4241
- Reconstruction:
43-
- Tracking & Triangulation: reconstruction.md
44-
- Custom ONNX Trackers: onnx_trackers.md
45-
42+
- Tracking & Triangulation: reconstruction.md
43+
- Custom ONNX Trackers: onnx_trackers.md
4644

4745
plugins:
4846
- search
@@ -63,7 +61,5 @@ markdown_extensions:
6361
- pymdownx.tabbed:
6462
alternate_style: true
6563

66-
67-
6864
copyright: |
69-
&copy; 2023 <a href="https://github.com/mprib" target="_blank" rel="noopener">Mac Prible</a>
65+
&copy; 2026 <a href="https://github.com/mprib" target="_blank" rel="noopener">Mac Prible</a>

0 commit comments

Comments
 (0)