spatialrust_vision/error.rs
1use spatialrust_image::ImageError;
2
3/// Result type for image and vision operations.
4pub type VisionResult<T> = Result<T, VisionError>;
5
6/// Errors raised by image and vision algorithms.
7#[derive(Clone, Debug, PartialEq, thiserror::Error)]
8pub enum VisionError {
9 /// Image construction or layout validation failed.
10 #[error(transparent)]
11 Image(#[from] ImageError),
12 /// An operation received unusable image dimensions.
13 #[error("invalid image dimensions: {0}")]
14 InvalidDimensions(String),
15 /// A numeric parameter was invalid.
16 #[error("invalid parameter: {0}")]
17 InvalidParameter(String),
18 /// Input collections or maps had incompatible shapes.
19 #[error("shape mismatch: {0}")]
20 ShapeMismatch(String),
21 /// A descriptor buffer does not match its declared row layout.
22 #[error("descriptor layout {rows}x{width} requires {expected} values, found {actual}")]
23 DescriptorLayout {
24 /// Descriptor row count.
25 rows: usize,
26 /// Values or bytes per descriptor.
27 width: usize,
28 /// Required flat storage length.
29 expected: usize,
30 /// Supplied flat storage length.
31 actual: usize,
32 },
33 /// Keypoint and descriptor row counts differ.
34 #[error("feature set has {keypoints} keypoints but {descriptors} descriptor rows")]
35 FeatureCountMismatch {
36 /// Number of keypoints.
37 keypoints: usize,
38 /// Number of descriptors.
39 descriptors: usize,
40 },
41 /// A feature match references a keypoint outside its collection.
42 #[error(
43 "feature match index is out of bounds: query {query}/{queries}, train {train}/{trains}"
44 )]
45 MatchIndexOutOfBounds {
46 /// Query index.
47 query: usize,
48 /// Query feature count.
49 queries: usize,
50 /// Train index.
51 train: usize,
52 /// Train feature count.
53 trains: usize,
54 },
55 /// Inlier and residual arrays do not match the correspondence count.
56 #[error(
57 "geometry result for {correspondences} correspondences has {inliers} inlier flags and {residuals} residuals"
58 )]
59 GeometryResultLayout {
60 /// Number of input correspondences.
61 correspondences: usize,
62 /// Number of inlier flags.
63 inliers: usize,
64 /// Number of residual values.
65 residuals: usize,
66 },
67 /// A geometric transform could not be inverted.
68 #[error("transform is singular")]
69 SingularTransform,
70}