Engineering Dynamics Company
CamMatch™
Camera Matching & Visualization for Blender
A practical, step-by-step guide to solving a camera with CamMatch. It follows the add-on's panels in the order you actually use them and reflects the current UI.
CamMatch is built for fixed-focal-length footage — a camera whose lens does not zoom or change focus during the shot. You calibrate the lens once and that single calibration governs every solved frame. Zoom/variable-lens footage is supported as an advanced exception (see Lens type), but the whole workflow below assumes a fixed lens.
New to the add-on? Read Core concepts first — the rest of the guide assumes you know the difference between intrinsics and pose, and between a track and a 3D point.
Movie Clip Editor > Sidebar/Tools region > CamMatch tab (with the clip in Tracking mode). Extra point tools live in 3D Viewport > Sidebar (N) > CamMatch.cv2). Install it from Edit > Preferences > Add-ons > CamMatch if Blender can't import it, then restart Blender.CamMatch answers one question: given 2D image points that you know the real 3D location of, where was the camera (and what lens did it have)? That's the PnP ("Perspective-n-Point") problem.
You supply two things and CamMatch matches them:
| You provide | In Blender this is | Example |
|---|---|---|
| 2D points — where a feature appears in the footage | a track (marker) in the Movie Clip Editor | the corner of a stop sign, tracked frame by frame |
| 3D points — where that feature really is in the world | an object (usually an Empty) placed at the surveyed coordinate | the same stop-sign corner at its measured survey point |
A link ties one track to one object. With enough good links on a frame, CamMatch can solve that frame.
Two things get solved, and it helps to keep them separate:
CamMatch's intended workflow is fixed-focal-length: the lens is assumed not to change during the shot, so you calibrate the lens once and then solve the camera's pose on every frame you need — the one calibration governs the entire shot. This keeps the lens well-constrained and every frame mutually consistent. Zoom/focus-pull footage (a variable lens) is the exception; see Lens type.
CamMatch is split into collapsible panels in the Clip Editor sidebar, top to bottom:
| Panel | What it's for |
|---|---|
| Quick Actions (top, always open) | Camera selection, the big Calibrate / Solve buttons, links refresh, diagnostics, report export, background transparency, render overscan. Your day-to-day controls. |
| Status & Reprojection | A live read-out of the last solve/calibration: message, mean/worst error, inlier count, and which frame it came from. |
| Calibration | Intrinsics: which lens parameters to solve, distortion model, single-frame Calibrate Camera, and Multi-Frame Calibration. |
| Solve Camera | Pose: PnP method, acceptance gates, Solve Camera Pose, pose uncertainty settings, and Solve Multi-Frame. |
| Track & Links | The track↔object link table, auto-linking, filtering, error thresholds, and per-track cleanup. |
| Settings | The raw tracking-camera parameters (focal, sensor, optical center, distortion) for inspection/manual edits. |
| Diagnostics | Open the generated heatmap / calibration / solve overlay images. Verbose logging toggle. |
| Reset | Reset Session — only if things get into a bad state. |
The 3D Viewport > Sidebar (N) > CamMatch tab has a small Quick Point Creation tool for placing control-point Empties by clicking in the viewport.
Use Blender's normal tracking tools to place a track on each image feature that corresponds to one of your 3D points. Each track needs a marker on every frame you intend to solve. Give tracks sensible names — matching names make linking automatic (next step).
Open Track & Links.
Handy filters (under Auto-Link, Filter & Sort):
Skip this only if you already trust the lens values. Open Calibration.
fx = fy (leave on unless diagnosing pixel aspect).14, 28, 40-56, 89), and click Calibrate Multi-Frame. This solves one shared lens across all those views — exactly the fixed-lens assumption — and is far better conditioned than a single frame. On success it also turns Key Intrinsics off so the single calibration governs every solved frame.Calibrated (multi-frame) @ 14, 28, 40-56 · stored @ Y (or (single-frame) @ frame X) — and the Status & Reprojection box reports the RMS error. Diagnostic images and the compositor undistort nodes are created automatically.Reset Intrinsics returns the lens to a sensible default (focal length scaled from the sensor width), available when intrinsics aren't locked.
Open Solve Camera (or use the Solve button in Quick Actions).
This solves the camera's pose on many frames — the camera moves through space, but the lens stays fixed (calibrated once in step 4). In Solve Camera, enable Solve Multi-Frame.
14, 28, 40-56, 89).Every solved frame gets pose keyframes (and, if Key Intrinsics is on, lens keyframes too). Frames that fail the gates are left un-keyed so they don't pollute the result.
After any solve, Status & Reprojection shows the mean/worst error and inlier count, and the Track & Links rows show each track's error and status dot.
Tools for finding and fixing bad correspondences (Track & Links > Auto-Link, Filter & Sort):
Automatic per-frame cleanup (in Solve Camera):
Per-track manual control lives in the list:
Selecting a track in the list also selects its linked 3D point in the viewport and outliner (and vice-versa when you move a track in the clip), so you can quickly see which control point is misbehaving. Turn on Show Error Points in 3D (Quick Actions) to visualize error-colored points in the viewport.
Recalibration changes the lens, so any frame you already solved against the old lens is now geometrically inconsistent.
Multi-frame calibration turns Key Intrinsics off on success, so the single calibration governs every solved frame.
CamMatch estimates how sensitive each solved pose is to noise, automatically, on every solve (Monte-Carlo perturbation). In Solve Camera:
Results (translation and rotation standard deviation and 95th percentile, per frame) appear in the exported reports.
Diagnostic images are created automatically after each calibration and solve. Open them from the Diagnostics panel:
The Diagnostics button in Quick Actions opens the current frame's overlays directly. Enable Verbose Logging (bottom of Diagnostics) for detailed console output when troubleshooting.
Click Generate Reports (Quick Actions). Choose a folder and CamMatch writes one HTML file per report plus a combined AllReports file. Open any of them in a browser and use Print > Save as PDF for a PDF.
Reports include lens parameters, solve quality (per frame), track details, per-track-over-time, camera trajectory, pose uncertainty, a forensic summary, and a methodology section. Distances are reported in the active scene's length units. Frames whose camera pose keyframe was deleted are pruned automatically on export.
Usage checkbox (left column):
| Icon | Meaning |
|---|---|
| Filled check / filled keyframe | Track is used on this frame (keyframe icon = a per-frame usage key is set) |
| Empty check / hollow keyframe | Track is not used on this frame |
| Hidden (eye-off) | Track has no marker on this frame |
Error status dot (Err % column):
| Color | Meaning |
|---|---|
| 🟢 Green | Error below the Warn threshold — good |
| 🟡 Yellow | Between Warn and Critical |
| 🔴 Red | At/above Critical (a used inlier) — problem |
🟠 Orange + OUT | RANSAC outlier — the solve didn't use it |
🟠 Orange + AUTO | Auto-disabled (critical) — the solver dropped it this frame |
| ⚪ Gray | Not used on this frame (no marker or toggled off) |
The 🔘 dot next to a track name means it's currently selected/active in the Clip Editor.
Calibration precedence, briefly: calibration always writes an intrinsic keyframe at its own frame (constant interpolation). With Key Intrinsics off, a solved frame holds the most recent calibration forward — so recalibrating and re-solving picks up the new lens. With it on, a solved frame owns its lens and won't inherit a later recalibration.
| Symptom | Fix |
|---|---|
| OpenCV not found | Click Install OpenCV in Edit > Preferences > Add-ons > CamMatch (it installs the bundled copy, and falls back to downloading from the internet automatically), then restart Blender. Still stuck? See If OpenCV still won't install below. |
| Panels are empty / "Load a movie clip" | Load footage in the Movie Clip Editor and make sure it's in Tracking mode. |
| Solve fails: "needs at least N points" | Add more valid current-frame links. Under 6 points CamMatch falls back to methods that need fewer, but more points solve better. |
| Many RANSAC outliers | Check the track↔object links, re-track low-quality markers, and verify 3D point positions. |
| High reprojection error | Use the overlays and the Outside Critical filter to find bad correspondences; disable or fix them and re-solve. |
| Multi-frame calibration frame looks misaligned | Fixed — the overlay now uses the scene frame for its background plate. Update to the latest version. |
| Report shows a frame with no 2D points | Delete that frame's camera pose keyframe, or re-export (stale-key frames are pruned on export). |
| A report frame is marked ⚠️ stale | You recalibrated after solving it. Click Re-solve Stale Frames in the Solve Camera panel. |
| Intrinsics changed unexpectedly | Enable Lock Intrinsics after calibration. |
| Range solve skips frames | Check Min Points / Min Inliers / Min Inlier Ratio, the Reject/Auto-Disable Critical gates, and whether the tracks have markers on those frames. |
| Session in a weird state | Reset panel > Reset Session. |
CamMatch tries the bundled offline copy first and then the internet automatically, and it works with the numpy that Blender already ships — so a Python-version mismatch (for example Blender 5.1 on Python 3.13) no longer blocks it. If it still can't install — an offline-only machine, or a corporate firewall blocking PyPI — install OpenCV into Blender's own Python by hand:
blender.exe — for example ...\Blender 5.1\5.1\python\bin\python.exe on Windows."<path-to>\python.exe" -m pip install "opencv-python-headless<5""<path-to>\python.exe" -c "import cv2; print(cv2.__version__)" should print a version number.If OpenCV imports in Blender's Python but CamMatch still reports it missing, disable and re-enable the CamMatch extension (or restart Blender once more) so its dependency check re-runs.
CamMatch™ is a trademark of Engineering Dynamics Company (Anthony Cornetto). The source code is GPL v3. CamMatch is a measurement/visualization aid, not a substitute for professional engineering judgment — independently validate every result. See NOTICE.md and README.md for licensing and the full disclaimer.