← EDC Software

Built for Blender • Powered by OpenCV

CamMatch™ Professional

Professional Camera Matching for Blender

CamMatch™ Professional is a professional camera matching solution developed for accident reconstruction, forensic engineering, and technical visualization. Built as a native Blender add-on and powered by OpenCV, it provides an efficient workflow for camera calibration, camera pose estimation, lens distortion correction, reprojection analysis, and forensic visualization — all inside Blender.

CamMatch™ Professional

See it in action

Calibration & diagnostics

Capabilities

What’s included

Your purchase provides access to the product’s repository and official update channel for the stated update term. It is not a proprietary software license; the installed add-on remains free software under the GNU GPL.

Learn more about repository access & licensing →

Professional Certification (offered separately)

The CamMatch™ Professional Certification Program teaches the complete camera matching workflow inside Blender, including 2D image markers, 3D control points, object linking, camera calibration, camera pose solving, reprojection error analysis, diagnostic visualization, and best practices for forensic visualization — live, virtual, and instructor-led, with practice Blender projects and datasets, and an official CamMatch™ Professional Certificate upon successful completion.

Certification sessions are scheduled periodically by Engineering Dynamics Company based on demand, with class sizes intentionally limited for personalized instruction and interactive Q&A. Contact info@edccorp.com for upcoming session dates.

Built for Professionals

CamMatch™ Professional is designed for accident reconstruction engineers, forensic engineers, engineering consultants, government agencies, law enforcement, universities, researchers, and professional visualization specialists.

OpenCV installs automatically

CamMatch uses OpenCV (the cv2 library) for its computer-vision math, but you don't install it separately. On first run, click Install OpenCV in the CamMatch add-on preferences and it sets itself up — from the copy bundled with the add-on, or from the internet if needed — on Windows, macOS, and Linux, and across every Blender Python version, including Blender 5.1 on Python 3.13.

If a machine is offline or behind a strict corporate firewall that blocks the download, the User Guide's Troubleshooting section has a one-line manual install into Blender's own Python. After installing, restart Blender and click Diagnostics in the CamMatch panel.

Requirements

Latest version

v2.7.0 · released 2026-09-30 · delivered through the EDC Software repository with automatic update notifications in Blender.

What’s new

Added

Each source is now run with the other two switched off, and the result is a table under the main one. On a real eight-point case at 57 ft mean range the camera position P95 was 1.80 ft, and broke down as:

| Source | Camera position P95 | | --- | --- | | Track positions | 0.22 ft | | 3D point positions | 1.40 ft | | Camera calibration | 1.38 ft |

Perfecting the tracking there would have changed the answer by inches. The report names the largest source when it is at least 1.5× the next, and says plainly that no single source dominates when it is not — sending someone to fix the one that is 3% ahead is worse than saying nothing.

It also states that the parts do not sum to the combined figure. They are percentiles of a distance rather than variances, and the inputs interact through the same solve, so a reader who adds them up and finds they do not match is not looking at a mistake.

The extra runs only happen when more than one input is in play, and a breakdown that fails does not lose the solve that was already in hand.

This measures it: the 2D points the calibration was fitted to are perturbed by the same tracking noise the pose estimate assumes, the calibration is re-run, and the spread of the focal is reported as a percentage. The result fills in Focal %, so the two halves join up.

On a single-view calibration over thirty well-spread points it comes out linear in the tracking noise:

| 2D noise | σ_f/f | | --- | --- | | 0.25 px | 0.034% | | 1.00 px | 0.135% | | 2.00 px | 0.271% | | 3.35 px | 0.454% |

At the 3.35 px of a real solve that is past the 0.35% crossover — the calibration, not the tracking, is then the larger source of pose uncertainty. Fewer points make it worse.

A run where nothing converged raises rather than reporting a spread of zero, which would read as a perfect calibration.

A calibration error is systematic. Holding the intrinsics fixed across every sample made it invisible — it moves the answer without widening the distribution, so no figure in the report could reflect it and no reader could tell whether it mattered.

Measured before building it, with OpenCV's own reported calibration sigmas: focal length is essentially the whole calibration term (against a focal-only P95 of 0.073 ft at 50 ft, the principal point gave 0.004 ft and the distortion coefficients 0.023 ft), and the camera position P95 from focal uncertainty is about 1.82 × range × (σ_f/f) — linear in both. On the same geometry 3.35 px of tracking noise gives about 0.0063 × range, so:

| σ_f/f | Typical source | Against the tracking term | | --- | --- | --- | | 0.08% | Chequerboard calibration | 0.23× — a rounding error | | 0.35% | — | equal | | 1% | Focal solved from the scene | 2.9× — dominates | | 3% | EXIF, unchecked | 7.8× |

Only the focal is perturbed; the other two together are a few percent of it in quadrature, and an input nobody can answer is worse than one not asked. fx and fy move together, because a focal error is one error rather than an aspect-ratio uncertainty no calibration reports.

The report states which assumption was made either way. Left at 0 it says the calibration was treated as exact and that nothing in the figures reflects it; set, it gives the value and notes when it is past the 0.35% crossover.

Measured on synthetic geometry at the 3.35 px noise of a real solve, the camera position's P95 came to 2.0× the translation's at 50 ft, 1.7× at 100 ft and 1.8× at 200 ft. Reports showing only the translation were quoting a number roughly half the size of the one the question asks for.

Both are now reported, position first, with a line stating that they are different quantities. The status line after a run quotes the position.

Fixed

It now measures over the frames the calibration recorded — all of them, jointly, for a multi-frame fit — and takes its noise from the calibration's own residuals, corrected for what that fit spent: the free intrinsics once and six extrinsics per view. Using the pose's six instead understated the noise by a quarter on an eleven-point single-frame calibration.

Measured against known noise, 400 synthetic solves per row:

| Points | RMS ÷ true noise | Corrected ÷ true noise | | --- | --- | --- | | 8 | 0.753 | 0.952 | | 10 | 0.814 | 0.973 | | 14 | 0.878 | 0.990 | | 20 | 0.914 | 0.992 | | 40 | 0.960 | 0.998 |

Auto Noise now applies the standard √(N/(N−p)) correction over N = 2 × points residual components and p = 6 pose parameters. On a fourteen-point solve that raises the assumed noise by 12%, and the reported uncertainty with it. Too few points to correct leaves the figure alone rather than dividing by zero.

---

Download CamMatch-*.zip below and install in Blender via Edit > Preferences > Add-ons > Install from Disk. Requires Blender 5.0+.

Install & updates

Your repository secret is delivered instantly — it appears on the confirmation page as soon as you check out (and free products issue one after a quick sign-up). Then, in Blender 5.0 or newer:

  1. Open Edit → Preferences → Get Extensions.
  2. Open the Repositories dropdown (top right) → + → Add Remote Repository, and paste https://extensions.edccorp.com/index.json.
  3. Enable "Requires Access Token" on that repository and paste the repository secret you received into the Secret field.
  4. Your products appear under Available — click Install.
  5. Make sure the add-on is enabled. Installing usually ticks its checkbox for you, but if the product's sidebar tab doesn't appear, open Edit → Preferences → Add-ons, search for the product, and tick its checkbox to activate it. Updates then arrive automatically.
  6. Save your preferences so this sticks. Blender normally saves them automatically; if it doesn't, open the ≡ menu at the bottom-left of the Preferences window and choose Save Preferences — otherwise you may have to re-enable the add-on next time you open Blender.

Upgrading from an older, manually-installed version of this add-on? You can disable or remove it anytime from Edit → Preferences → Add-ons — search for it, untick it to disable, or use Remove to uninstall. The new extension replaces it.

Because the installed add-on is GPL-licensed free software, copies you have already received remain yours to use, study, modify, and share under the GPL. When the update term ends, repository access for future official builds and automatic updates may require renewal.