When you work with multiple calibration sessions — recorded at different times or under different conditions — you need a way to determine which calibration best matches a particular piece of performance footage. You can use the calibration selector Blueprint functions to rank and choose calibrations automatically, based on either recording-time proximity or reprojection-quality diagnostics.
Prerequisites
To use calibration selectors, you need:
An Unreal Engine 5.6 (or later) project with the MetaHuman Calibration Processing plugin enabled.
At least one Footage Capture Data asset containing image sequences with valid timecode and frame rate information.
One or more camera calibration assets to choose from, each with attached camera calibration metadata (generated automatically when calibrations are created through the calibration pipeline).
For the Diagnostics Based Selector: the MetaHuman Calibration Diagnostics plugin enabled (this is an Experimental plugin).
How Selectors Work
Two selector strategies are available:
| Selector | Description |
|---|---|
Timecode Based Selector | Ranks calibrations by how close their recording timecode is to the footage. Fast, metadata-only — no image processing required. |
Diagnostics Based Selector | Ranks calibrations by running feature-matching diagnostics against the actual footage. Slower but more accurate — evaluates reprojection error and spatial coverage. |
Both selectors share a common interface with two key functions:
| Function | Description | Node |
|---|---|---|
Select Calibration | Returns the single best calibration for the given footage. Use it when you need only the match, which is the common case. | |
Order Calibrations | Returns all valid calibrations ranked from best to worst. Use it when you want to inspect alternatives, debug an unexpected result, or layer your own secondary logic over the ranking. |
All selectors follow the same three-step pattern:
1. Construct a selector instance with a Construct Object node, for example, Construct MetaHuman Timecode Based Selector.
2. Configure the selector, if required, by creating a settings object and passing it via Set Settings.
3. Call either Select Calibration to get the single best result, or Order Calibrations to get a ranked list.
Both Select Calibration and Order Calibrations nodes take the same inputs:
In Capture Data — The Footage Capture Data asset that you want to find a calibration for.
In Camera Calibrations — An array of Camera Calibration assets to evaluate.
Select Calibration returns a single Camera Calibration reference (or null if no valid calibration was found). Order Calibrations returns an array of Camera Calibration references sorted from best to worst, with invalid calibrations filtered out.
Timecode Based Selector
The timecode based selector requires no configuration and no image processing. It ranks calibrations by how close in time they were recorded relative to the footage. The assumption is that a calibration recorded closer to the capture is more likely to reflect the camera's state during filming.
How Timecode Ranking Works
The selector reads the start timecode from the first image sequence in your footage capture data asset and compares it against the generation timecode stored in each calibration's metadata. Calibrations are then sorted by absolute time difference — the closest match ranks first.
Before ranking, the selector automatically filters out calibrations that are unlikely to produce good results:
| Filter | Rule | Reason |
|---|---|---|
Missing Metadata | Calibration has no Camera Calibration Metadata attached | Cannot determine recording time or quality. |
High RMS Error | Reprojection RMS error exceeds 1.0 pixel | Indicates poor checkerboard detection or lens model fit. |
Zero RMS Error | Reprojection RMS error is exactly 0.0 | Means the calibration tool failed to compute the metric. |
Too Few Frames | Calibration was generated from fewer than 5 frames | Insufficient coverage to constrain distortion coefficients reliably. |
Invalid Timecode | Generation timecode or frame rate is missing or invalid | Cannot compute time difference for ranking. |
Timecode Based Selector Workflow
To use the timecode based selector workflow:
1. Create a timecode based selector using a Construct MetaHuman Timecode Based Selector node.
2. Call Select Calibration (or Order Calibrations), passing your Footage Capture Data and the array of Camera Calibrations.
No settings configuration is required — the Timecode Based Selector works purely from the metadata already present on your assets.
When to Use the Timecode Based Selector
Use the timecode based selector workflow when:
You have calibrations recorded at known times relative to your footage.
You want a fast, lightweight selection with no image processing overhead.
Your calibration sessions are well-organized and you trust the metadata quality.
Timecode information will only be available in the Camera Calibration asset metadata if the calibration was generated in UE
Diagnostics Based Selector
The diagnostics based selector evaluates each calibration against the actual footage by running feature-matching diagnostics. Rather than relying on metadata alone, it undistorts and reprojects detected features from the footage using each candidate calibration and measures how well they align. This produces a quality score that reflects real-world accuracy.
The diagnostics based selector is part of the MetaHuman Calibration Diagnostics plugin, which is currently marked as Experimental. Its API and behavior may change in future releases.
How Diagnostics Ranking Works
For each candidate calibration, the selector:
1. Detects robust image features across the specified frames of the footage.
2. Reprojects the detected 3D points back into each camera using the candidate calibration's intrinsics and distortion model.
3. Measures the reprojection error — how far the reprojected points land from where they were actually detected.
4. Evaluates spatial coverage — whether accurate matches are spread across the frame or concentrated in one region.
5. Computes a combined quality score from these metrics.
The scoring combines reprojection error accuracy and spatial coverage into a single quality score per calibration. Calibrations are ranked by total score from highest (best) to lowest.
The diagnostics run in parallel across multiple threads, with a progress dialog that shows which calibration is being evaluated. You can cancel at any time — the selector returns whatever results have been computed so far.
Frame Providers
The Diagnostics Based Selector needs to know which frames from the footage to analyze. You specify this through a Frame Provider, an object that supplies a list of frame indices.
| Frame Provider | Description |
|---|---|
Manual Frame Provider | You specify an explicit list of frame indices to analyze. |
The Frame Provider is set on the Diagnostics Based Selector Settings object, which is then passed to the selector via Set Settings.
Diagnostics Based Selector Workflow
To use the diagnostic based selector workflow:
1. Create a diagnostics based selector using a Construct MetaHuman Diagnostics Based Selector node.
2. Create a Manual Frame Provider using a Construct MetaHuman Manual Frame Provider node. Set its Selected Frames array to the frame indices you want to analyze.
3. Create a Diagnostics Based Selector Settings object using a Construct MetaHuman Diagnostics Based Selector Settings node. Assign the Frame Provider to its Frame Provider property.
4. Call Set Settings on the selector, passing the settings object.
5. Call Select Calibration (or Order Calibrations), passing your Footage Capture Data and the array of Camera Calibrations.
When to Use the Diagnostics Based Selector
Use the Diagnostics Based Selector when:
You need the most accurate calibration match and are willing to spend processing time.
Timecode information is unreliable or unavailable.
You want to validate that a calibration actually produces good results on your specific footage, rather than trusting metadata alone.
Understanding the Results
Select Calibration returns the single top-ranked camera calibration, or null if no valid calibration was found. This is the most common entry point — use it when you simply need the best match.
Order Calibrations returns an array of camera calibrations sorted from best to worst. Invalid calibrations (those that fail the selector's filtering criteria) are excluded from the results entirely. Use this when you want to inspect alternatives or implement your own secondary selection logic on top of the ranking.
In both cases, a null or empty result means none of the provided calibrations passed the selector's quality filters. Check the Output Log for warnings that explain why individual calibrations were excluded.
Best Practices
Start with Timecode Based Selection. It is fast, requires no configuration, and works well when your calibration sessions have reliable timecodes. Only switch to the Diagnostics Based Selector when you need to verify actual image-quality fit.
Combine with Batch Generate Camera Calibration. Use Batch Generate Camera Calibration to produce multiple calibrations from different sessions, then use a selector to pick the best one for each piece of footage. The batch results include RMS error, which the Timecode Based Selector uses as a quality filter.
Choose analysis frames carefully for Diagnostics. While selecting frames spread across the beginning, middle, and end of the timeline is best practice, the process also works with a single frame. The diagnostics are generally more reliable with diverse frames — 3 to 5 well-distributed frames is typically sufficient. More frames improve accuracy but increase processing time proportionally.
Check the Output Log when results are empty. Both selectors log warnings explaining why individual calibrations were filtered out. Common causes include missing metadata, high reprojection error, or too few frames used during calibration generation.
Use Order Calibrations for debugging. When Select Calibration returns an unexpected result, switch to Order Calibrations to see the full ranking. This helps you understand why a particular calibration was preferred and whether close alternatives exist.
Ensure metadata is present on your calibrations. Both selectors rely on camera calibration metadata being attached to each calibration asset. Calibrations generated through the MetaHuman calibration pipeline have this metadata automatically. If you created calibrations through other means, the selectors may skip them.
Creating Custom Selectors
The selector system is designed to be extensible. Both UMetaHumanCalibrationSelector and UMetaHumanCalibrationSelectorSettings are marked as Blueprintable, which means you can create your own selector strategies in Blueprint or C++ by subclassing the base types.
To create a custom selector:
1. Create a new Blueprint class that inherits from MetaHuman Calibration Selector.
2. Override the Order Calibrations function with your custom ranking logic.
3. Optionally create a custom Settings subclass if your selector needs configuration, and override Get Settings Class to return it.
The Select Calibration function does not need to be overridden — by default it calls Order Calibrations and returns the first result.
Python Scripting
Both selectors are accessible from Python through the Unreal Editor scripting API.
Timecode Based Selection
import unreal
# Load your footage and calibration assets
capture_data = unreal.load_asset("/Game/Captures/Day1_StereoCapture")
calibrations = [
unreal.load_asset("/Game/Calibrations/CC_Morning"),
unreal.load_asset("/Game/Calibrations/CC_Afternoon"),
unreal.load_asset("/Game/Calibrations/CC_Evening"),
]
# Create the selector
selector = unreal.MetaHumanTimecodeBasedSelector()
Diagnostics Based Selection
import unreal
capture_data = unreal.load_asset("/Game/Captures/Day1_StereoCapture")
calibrations = [
unreal.load_asset("/Game/Calibrations/CC_Morning"),
unreal.load_asset("/Game/Calibrations/CC_Afternoon"),
unreal.load_asset("/Game/Calibrations/CC_Evening"),
]
# Create the selector
selector = unreal.MetaHumanDiagnosticsBasedSelector()
# Create a frame provider with the frames to analyze
Python calls to the Diagnostics Based Selector are synchronous — the Editor will be unresponsive while feature matching runs. For large calibration sets or many analysis frames, consider running from the command line with -run=pythonscript to avoid blocking the Editor UI.