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.

See it in action
Calibration & diagnostics




Capabilities
- Native Blender integration
- Camera calibration
- Camera pose estimation
- Lens distortion calibration
- 2D-to-3D object linking
- Multi-frame camera tracking
- Reprojection error analysis
- Diagnostic overlays
- Monte Carlo uncertainty analysis
- Forensic visualization workflows
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.
- GPL software package for CamMatch™ Professional
- One year of authenticated repository access for downloads
- Repository-delivered updates, bug fixes, improvements, and new releases during the access term
- Repository secret associated with the purchaser email
- Official documentation
- Continued use of already-downloaded versions after repository access expires
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
- Blender 5.0 or newer
- OpenCV — installs automatically from the panel on first run (Windows, macOS, and Linux)
Latest version
v2.8.5 · released 2026-10-10 · delivered through the EDC Software repository with automatic update notifications in Blender.
What’s new
Added
- Auto Monte Carlo on Calibrate (Calibration panel) decides whether each calibration measures its own uncertainty as part of calibrating, the way Auto Monte Carlo on Solve does for the pose. On by default. With it off, calibrating only calibrates and Measure Calibration Uncertainty runs the measurement on demand, to the same numbers.
- Solved frames (Solve Camera panel, under the button) lists every frame that has a pose solve, with the count. It is read from the same records as the report's *Across N solved frame(s)* line, so the two agree. The Calibration panel's status line already lists the frames the lens was calibrated from. Arrows at the line's right end jump the timeline to the previous or next solved frame, and the triangle at its left unfolds the list into a button per frame.
- A moved camera is noticed. Every solve records the pose it wrote. When a solved frame's keys no longer hold it — a nudge with auto-key on, or a key set by hand — the Solve panel says *Camera moved since solving on N frame(s)*, with the distance and angle on the current frame, and the report marks those frames *⚠️ moved*. The figures for such a frame describe the solved pose, not the one the camera holds.
- An edited lens is noticed. Every calibration records the lens values it left on the clip. When the focal, principal point, distortion or sensor width differ from them, the Calibration panel, the Solve panel and both reports say *The lens has been edited since it was calibrated*, with what changed. Restore Calibrated Lens puts the calibrated values back without a recalibration. Quiet while Key Intrinsics is on.
- Remove Solve (Solve Camera panel, under the Solved frames line) removes the solve on the current frame: its stored errors and pose uncertainty, and the camera's pose keyframes there. The camera then follows whatever keys remain, or your own. Keep Keyframes, in the redo panel, leaves the keys for a camera already animated by hand over the solve. Remove All does the same for every solved frame, after a confirmation. Both undo.
- Set Excluded Tracks to Not Used (Calibration panel, after a Robust calibration that excluded something). Robust's exclusion lives only in the calibration; the tracks stayed in every later solve. The panel now says *Robust excluded N track(s) still used by solves*, and the button sets them Not Used in one click, as the link's own switch does. Once they are out, Use Them Again in the same place puts them back, for a recalibration with them, and stays on offer whatever is calibrated in between. Both undo.
Fixed
- A Robust calibration that fails says what it was fitted over. The failure message came from the inner calibration alone, so "the optimizer diverged" read as though every point had been used. It now leads with how many points Robust kept and which it excluded, and says what to try.
- Enable All Tracks puts Not Used tracks back in use. It cleared only the per-frame usage keys, so a track set Not Used stayed out, and with no solved camera it did nothing. It now restores every Not Used link as well, and the Calibration panel offers it as Use All Tracks whenever any track is Not Used.
- The uncertainty re-fits the points a Robust calibration kept. The calibration uncertainty, and the lens re-fit inside the pose trials, gather the calibration's views from the frame again, and that returned every used track including the ones Robust had excluded. A Robust calibration now records the tracks it left out and the views leave them out; any other calibration clears the record. Re-run Robust calibrations made with earlier versions to refresh their stored views.
- The Lens Report says what a Robust calibration excluded. The excluded points go into the calibration's own residual store flagged OUT, so the per-track table lists them as NO with their residual under the fitted lens, and a *Robust calibration* row names them beside the RMS. The report had listed the kept points as the whole set. The row also says whether those tracks are still in use.
- A calibration frame is no longer listed as a solved frame. Both calibration paths wrote a per-frame solve record for every frame they fitted over, so a frame that was calibrated on but never pose-solved appeared in the Solved frames line and in Solve Quality, and calibrating on a solved frame replaced that frame's solve record with the lens fit's residuals. Calibration residuals now go to the calibration's own store only. Records already written this way by earlier versions show up as stored frames with no camera keyframe; Forget Them clears them.
- A frame whose camera keyframes were deleted by hand is no longer listed as solved without comment. Its records remained, so it stayed in the Solved frames line and in every count. The Solve and Status panels now say how many stored frames have no camera keyframe, which ones, and offer Forget Them. The report already pruned them on export.
- Measure Calibration Uncertainty keeps Blender responsive. It ran one calibration per trial over every calibrated frame in a single blocking call, which over a multi-frame calibration was long enough for the busy cursor. It runs in slices now like the pose estimates: the viewport stays live, the cursor shows progress, and Esc stops it.
- The Solve and Calibration panels say "will not measure" in the same place. With the switch off, the Solve panel's note sat a block lower, above the re-run buttons, while the Calibration panel's sat under its switch. Both sit directly under the switch now.
- The pose estimate's status line follows the scene unit. It was a string frozen when the run finished, so switching the scene from feet to metres left it reading in feet while the fields and the report had moved. It is rendered from the stored record on every draw now; the record keeps the sample split and the reject note so nothing in the line is lost.
- A pruned or re-solved frame no longer reappears in the Pose Uncertainty section. A run stores its result twice — once per frame, and once as a flat copy on the settings that the report falls back to when no per-frame record is left. Only the per-frame record was being dropped, so a report could read *"Across 1 solved frame(s): 185"* above a Pose Uncertainty block reporting frame 189 — a frame whose solve record had just been removed for having no markers left. Both copies are now forgotten together, and only for the frame being dropped — by the export's own pruning, by a re-solve, and by the Drop Them button.
- A raycast point is checked against the camera it was raycast from. A point's figures are a radius about its *stored* hit, taken from the camera that was there when it was raycast, while the trials are shot through whatever camera the active clip has now. Nothing compared the two, so three ordinary things produced wrong figures in silence: re-solving the camera, a second clip open in the Clip Editor, and geometry added in the ray's path.
Before any trial is spent, the stored pixel is re-shot through the current pose and the result compared with the stored hit — the position *and* the object it lands on. A ray that now misses, or lands on something else, or lands further than 1% of its range from where the point sits, is refused with the reason; a smaller move warns and is carried on the result, since refusing on it would make every solve invalidate every point.
Figures already stored are checked the cheap way, with no raycast: the run records the camera centre it used, so the report and the panel compare that with where the camera is now.
- A stored raycast point or measured distance is checked against the declared figures too. Each keeps the two noise figures it was run at, and nothing compared them with what the file holds — the same check the pose records and the calibration figure were given, missing from the third store. Both the report and the panel now say when a result was run at other figures, or by a CamMatch that did not record them.
- The session reset forgets the last pose uncertainty. It emptied the per-frame records and left the flat copy the report falls back to, so a reset file could still carry a pose uncertainty for a frame with no records at all.
- The calibration's noise figures and trial count can be entered before calibrating. The whole block was disabled until a calibration existed, so on a fresh file the two figures could not be typed — and the measurement that is supposed to run *during* a calibration therefore never could on the first one. Only the Measure Calibration Uncertainty button needs a lens to re-fit, and only it is disabled now. The same two figures were already editable in the Solve Camera and 3D Tracker panels, which made the same pair live in one place and dead in another.
- The pose estimate's status line prints the camera position in the scene's unit. It printed metres with no label while the report printed feet, so one run read 0.30 in the panel and 0.97 in the report.
- A successful pose estimate replaces an earlier failure in the status box. Running it on a frame with no markers, then on the right one, left the first attempt's message showing.
- Running an uncertainty estimate from a script shows its progress. The blocking entry point ran the whole job in one step, so the readout was never updated.
Changed
- The pose Monte Carlo draws its lens re-fits once per run and shares them across frames. The re-fit perturbs the calibration's own views, which are the same whatever frame is being posed, so it no longer runs inside every trial of every frame. The re-fits also run on every core: a thousand over a nine-frame calibration take about 3 s on four cores against 10 s on one, and each frame of a range then costs about 0.2 s. The correlations the per-trial re-fit kept — one survey error for the whole job, the pose frame sharing its own view's tracking draw — are kept. The numbers are statistically the same; the random draws differ, so a re-run of an old file will not reproduce its figures to the last digit.
- The uncertainty inputs in the Solve and Calibration panels are laid out the same way: the switch beside the trial count, then the two noise figures on the next row. The Solve panel's trial count is labelled Samples.
- Every comparison of a stored noise figure against the entered one uses a single definition, tolerant of the float32 round trip through Blender's properties at any magnitude. Previously each site had its own number, and the 3D one would have called a matching figure stale above a few scene units.
- The revision stamp on stored records is enforced: a test fingerprints both record layouts and fails, naming the field, when a field is added without the stamp moving. It is bumped to 2, since fields had been added since it was set.
---
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:
- Open Edit → Preferences → Get Extensions.
- Open the Repositories dropdown (top right) →
+ → Add Remote Repository, and paste
https://extensions.edccorp.com/index.json. - Enable "Requires Access Token" on that repository and paste the repository secret you received into the Secret field.
- Your products appear under Available — click Install.
- 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.
- 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.