Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
dc02752
Add camera-calibration math and persistence foundation
romleiaj Jul 9, 2026
8182927
Load external camera calibrations into datasets
romleiaj Jul 9, 2026
16e28dd
Add the Align View: warped display, linked navigation, and mirroring
romleiaj Jul 9, 2026
8cd66cf
Warp imported annotations onto every calibrated camera on request
romleiaj Jul 9, 2026
790837d
Store the calibration as one file per camera
romleiaj Jul 9, 2026
4358b58
Export the camera calibration and drop the all-pairs calibration.json
romleiaj Jul 10, 2026
6cd2696
Make calibration export per-camera on desktop and web, and add import
romleiaj Jul 10, 2026
de3518b
Polish the import/export menus around calibration
romleiaj Jul 10, 2026
e05d0a4
Import the calibration per camera pair, confirming replacement
romleiaj Jul 10, 2026
de84c25
Adopt image-registration naming across UI, API, files, and the wire f…
romleiaj Jul 10, 2026
9cd5419
Let the Reference Camera choice drive image registration
romleiaj Jul 10, 2026
7368b8c
lazy loading camera alignment tools only when multicamera
BryonLewis Jul 11, 2026
600cf3b
refactor common to simplify into separate files
BryonLewis Jul 11, 2026
6c3d8e5
refactor the linked viewer and aligned navigation into their own folder
BryonLewis Jul 11, 2026
f7889bb
LayerManager.vue simplification
BryonLewis Jul 11, 2026
886f957
folder for aligned camera utilites/tools
BryonLewis Jul 11, 2026
f3a39c5
more type specification for camera alignment models in the server
BryonLewis Jul 11, 2026
7bcfe84
client linting
BryonLewis Jul 11, 2026
826bfe0
minor fix
BryonLewis Jul 11, 2026
48c22d6
Accept untyped per-camera registration files in parent-folder discovery
romleiaj Jul 11, 2026
67cd6e5
Warn at desktop multicam import when registration names unknown cameras
romleiaj Jul 11, 2026
bbc1f68
Bring transform import at multicam creation to the web platform
romleiaj Jul 11, 2026
118cfad
Discover per-collect registration files in batch multicam import
romleiaj Jul 11, 2026
14e3be5
Keep the Aligned View warp in step with image-enhancement changes
romleiaj Jul 11, 2026
f71bf93
Deduplicate registration discovery and warning logic across platforms
romleiaj Jul 12, 2026
390416c
Drive the Aligned View warp from imageRevision instead of polling
romleiaj Jul 12, 2026
e016910
Fix the imageRevision warp watch, which referenced a layer out of scope
romleiaj Jul 12, 2026
1d9a2eb
Center the Align View reset on the selected camera's warped bounds
romleiaj Jul 12, 2026
f8af883
Add interactive calibration state, keypoint markers, and pair link
romleiaj Jul 9, 2026
52245f7
Add the Manual Alignment panel for in-app calibration creation
romleiaj Jul 9, 2026
06f2641
Adopt image-registration naming in the Manual Alignment feature
romleiaj Jul 12, 2026
4026cbd
Drive the registration ghost from the source camera's imageRevision
romleiaj Jul 12, 2026
55f0eaa
Streamline the Camera Registration panel around the import/export menus
romleiaj Jul 12, 2026
2151cd0
Make loaded registrations first-class in the Camera Registration panel
romleiaj Jul 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 34 additions & 2 deletions client/dive-common/apispec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ import { Attribute } from 'vue-media-annotator/use/AttributeTypes';
import { CustomStyle } from 'vue-media-annotator/StyleManager';
import { AttributeTrackFilter } from 'vue-media-annotator/AttributeTrackFilterControls';
import { ImageEnhancements } from 'vue-media-annotator/use/useImageEnhancements';
import {
CameraHomographies, CameraCorrespondences, CameraTransformTypes, RegistrationSource,
} from 'vue-media-annotator/alignedView/CameraRegistrationStore';
import type { PercentileStretch } from 'vue-media-annotator/use/useImageEnhancements';

type DatasetType = 'image-sequence' | 'video' | 'multi' | 'large-image';
Expand Down Expand Up @@ -136,6 +139,12 @@ export interface MultiCamImportFolderArgs {
sourceList: Record<string, {
sourcePath: string;
trackFile: string;
/**
* Optional alignment transform file for cameras after the first (desktop
* only): a DIVE registration .json, parsed at import time to seed the
* dataset's saved camera registration.
*/
transformFile?: string;
/** Per-camera media type when cameras differ (e.g. EO JPG + IR TIFF on web). */
type?: 'image-sequence' | 'video' | 'large-image';
}>; // path/track file per camera
Expand Down Expand Up @@ -186,9 +195,14 @@ interface DatasetMetaMutable {
attributes?: Readonly<Record<string, Attribute>>;
attributeTrackFilters?: Readonly<Record<string, AttributeTrackFilter>>;
datasetInfo?: Record<string, unknown>;
cameraHomographies?: CameraHomographies;
cameraCorrespondences?: CameraCorrespondences;
cameraTransformTypes?: CameraTransformTypes;
/** Producer provenance of the camera registration (see RegistrationSource). */
cameraRegistrationSource?: RegistrationSource | null;
error?: string;
}
const DatasetMetaMutableKeys = ['attributes', 'confidenceFilters', 'timeFilters', 'imageEnhancements', 'customTypeStyling', 'customGroupStyling', 'attributeTrackFilters', 'datasetInfo'];
const DatasetMetaMutableKeys = ['attributes', 'confidenceFilters', 'timeFilters', 'imageEnhancements', 'customTypeStyling', 'customGroupStyling', 'attributeTrackFilters', 'datasetInfo', 'cameraHomographies', 'cameraCorrespondences', 'cameraTransformTypes', 'cameraRegistrationSource'];

interface DatasetMeta extends DatasetMetaMutable {
id: Readonly<string>;
Expand Down Expand Up @@ -278,7 +292,7 @@ interface Api {
saveAttributeTrackFilters(datasetId: string,
args: SaveAttributeTrackFilterArgs): Promise<unknown>;
// Non-Endpoint shared functions
openFromDisk(datasetType: DatasetType | 'bulk' | 'calibration' | 'annotation' | 'text' | 'zip', directory?: boolean):
openFromDisk(datasetType: DatasetType | 'bulk' | 'calibration' | 'annotation' | 'text' | 'zip' | 'transform', directory?: boolean):
Promise<{canceled?: boolean; filePaths: string[]; fileList?: File[]; root?: string}>;
/** Desktop: immediate child directory names under a parent folder (multicam subfolder import). */
listImmediateSubfolders?(parentPath: string): Promise<string[]>;
Expand All @@ -294,10 +308,18 @@ interface Api {
): Promise<string>;
/** Desktop: stereoscopic calibration file in a parent folder root. */
findParentFolderCalibrationFile?(parentPath: string): Promise<string | null>;
/**
* Desktop: every DIVE camera-calibration .json (alignment transforms) in a
* parent folder root: per-camera *_registration.json files first, then
* other self-identified candidates.
*/
findParentFolderTransformFiles?(parentPath: string): Promise<string[]>;
/** True when the dataset folder has an attached stereoscopic calibration file. */
hasCalibrationFile?(datasetId: string): Promise<boolean>;
/** Web: stash a calibration File for multicam upload lookup. */
stashCalibrationFile?(key: string, file: File): void;
/** Web: stash a per-camera registration transform File for multicam upload lookup. */
stashTransformFile?(key: string, file: File): void;
getTiles?(itemId: string, projection?: string): Promise<StringKeyObject>;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
getTileURL?(itemId: string, x: number, y: number, level: number, query: Record<string, any>):
Expand All @@ -315,6 +337,16 @@ interface Api {
saveCalibration?(path: string): Promise<{ savedPath: string; updatedDatasetIds: string[] }>;
/** Desktop: set the stereo camera/calibration file for a single dataset. */
importCalibrationFile?(datasetId: string, path: string): Promise<{ calibration: string }>;
/**
* Merge a DIVE registration .json into an existing multicam dataset's
* saved camera registration. Web reads the provided File; desktop reads
* the path. options.camera keeps only the file's pairs naming that
* camera, replacing that camera's current pairs while other cameras'
* pairs are kept.
*/
importCameraRegistration?(datasetId: string, path: string, file?: File,
options?: { camera?: string }):
Promise<{ cameras: string[]; pairCount: number }>;
/** Desktop: copy the dataset's current camera/calibration file out to destPath. */
exportCalibrationFile?(datasetId: string, destPath: string): Promise<{ exportedPath: string }>;
/** Download/export the dataset's current calibration file (platform-specific). */
Expand Down
Loading
Loading