Skip to main content

Crate cumulus3d_features

Crate cumulus3d_features 

Source
Expand description

Image reading and SIFT feature extraction.

  • gray: decoding, grayscale conversion, downscaling, 90° rotation.
  • exif_info, camera_init: EXIF focal-length rules and initial camera values.
  • sift: deterministic SIFT (feature-count limit per level); the backend can be swapped via sift::SiftEngine.
  • extract: camera grouping + incremental FeatureStore writes.

§Usage example

use cumulus3d_core::FeatureStore;
use cumulus3d_features::{
    CpuSift, ExifInfo, ExtractionOptions, FeatureExtractor, GrayImage, ImageSource, ImageStatus, SiftEngine,
    SiftOptions,
};

// Synthetic image: three bright blobs.
let blob = |x: usize, y: usize, cx: f32, cy: f32, s: f32| {
    let (dx, dy) = (x as f32 - cx, y as f32 - cy);
    (-(dx * dx + dy * dy) / (2.0 * s * s)).exp()
};
let img = GrayImage::from_f32(320, 240, |x, y| {
    0.2 + 0.6 * (blob(x, y, 80.0, 60.0, 6.0) + blob(x, y, 200.0, 150.0, 9.0) + blob(x, y, 260.0, 70.0, 5.0))
});

// 1) Call the SIFT backend directly: feature i <-> descriptor row i.
let out = CpuSift::new().extract(&img, &SiftOptions::default())?;
assert!(!out.is_empty());
assert_eq!(out.features.len(), out.descriptors.len());

// 2) Write to the store (camera assignment + keypoints and descriptors).
let store = FeatureStore::new();
let src = ImageSource { name: "camF/0001.jpg".into(), gray: img, exif: ExifInfo::default() };
let reports = FeatureExtractor::new().extract_inputs(&store, vec![src], &ExtractionOptions::default())?;
assert!(matches!(reports[0].status, ImageStatus::Extracted { .. }));
assert_eq!(store.num_images(), 1);

Re-exports§

pub use camera_init::infer_focal;
pub use camera_init::init_camera;
pub use camera_init::lookup_sensor_width;
pub use camera_init::FocalEstimate;
pub use exif_info::ExifInfo;
pub use extract::extract_for_camera;
pub use extract::image_folder;
pub use extract::read_image_list;
pub use extract::CameraMode;
pub use extract::ExtractionOptions;
pub use extract::FeatureExtractor;
pub use extract::ImageReport;
pub use extract::ImageSource;
pub use extract::ImageStatus;
pub use extract::ReaderOptions;
pub use gray::limited_size;
pub use gray::read_gray;
pub use gray::rgb_to_gray;
pub use gray::rotate_keypoint_ccw;
pub use gray::GrayImage;
pub use sift::CpuSift;
pub use sift::DescriptorNormalization;
pub use sift::FeatureSelection;
pub use sift::SiftEngine;
pub use sift::SiftFeature;
pub use sift::SiftOptions;
pub use sift::SiftOutput;

Modules§

camera_init
Initial camera parameters.
exif_info
Reads only the needed values from EXIF (focal length, sensor info, orientation, GPS).
extract
Image list -> camera grouping -> SIFT -> incremental FeatureStore writes.
gray
8-bit grayscale image: decoding, grayscale conversion, downscaling, 90° rotation.
sift
SIFT. Heavy computation sits behind SiftEngine.