pub struct DenseConfig {
pub undistort: UndistortOptions,
pub scene: SceneOptions,
pub densify: DensifyOptions,
pub score: Option<ScoreFusionOptions>,
pub backend: Result<Arc<dyn PatchMatchBackend>, String>,
pub lock: Option<Arc<Mutex<()>>>,
pub depth_cache: Option<Arc<DepthMapCache>>,
pub undistort_cache: Arc<UndistortCache>,
pub undistort_backend: Option<Arc<dyn UndistortBackend>>,
}Expand description
Densification settings.
Fields§
§undistort: UndistortOptionsUndistortion options.
scene: SceneOptionsDense scene conversion options.
densify: DensifyOptionsDensification (PatchMatch, filter, fusion) options.
score: Option<ScoreFusionOptions>Score fusion settings (if present, score fusion is used instead of densify.fusion.mode).
backend: Result<Arc<dyn PatchMatchBackend>, String>Backend (if it could not be created, that error; reported in the densification stage).
lock: Option<Arc<Mutex<()>>>--serialize-dense: one backend call at a time.
depth_cache: Option<Arc<DepthMapCache>>Depth map cache (--depth-cache).
undistort_cache: Arc<UndistortCache>Undistortion result cache.
undistort_backend: Option<Arc<dyn UndistortBackend>>Image undistortion backend (None = CPU).
Implementations§
Source§impl DenseConfig
impl DenseConfig
Sourcepub fn new(
backend: Result<Arc<dyn PatchMatchBackend>, String>,
profile: MvsProfile,
) -> Self
pub fn new( backend: Result<Arc<dyn PatchMatchBackend>, String>, profile: MvsProfile, ) -> Self
Undistortion max_image_size 960, profile defaults.
Examples found in repository?
examples/hooks.rs (line 65)
49fn main() -> Result<(), String> {
50 let out = std::env::args().nth(1).map(PathBuf::from).unwrap_or_else(|| std::env::temp_dir().join("cumulus3d_hooks"));
51 let src = out.with_extension("src");
52 if !src.join("gps_ref.txt").exists() {
53 common::make_dataset(&src);
54 }
55 if out.exists() {
56 std::fs::remove_dir_all(&out).map_err(|e| e.to_string())?;
57 }
58 let layout = Layout::discover(&src, 1)?;
59 let npos = layout.frames.len();
60
61 let mut cfg = SessionConfig::new(src.join("images"));
62 cfg.gps = read_gps_file(src.join("gps_ref.txt")).map_err(|e| e.to_string())?;
63 (cfg.span, cfg.overlap, cfg.total_positions, cfg.seed) = (4, 1, Some(npos), Some(7));
64 if cumulus3d_cuda::is_available() {
65 let mut d = DenseConfig::new(make_pm_backend("cuda"), parse_profile("fast")?);
66 d.undistort.max_image_size = 160;
67 cfg.dense = Some(d);
68 }
69
70 // Hook: print event text, zone point-cloud point counts, warnings and errors; plus the default output hook (files).
71 let pipeline = Pipeline::new(Session::new(cfg))
72 .on_any(|e: &Event| {
73 if let Some(t) = e.timeline_text() {
74 println!("[event v{}] {t}", e.meta().version);
75 }
76 })
77 .on(EventKind::ZonePreview, |e: &Event| {
78 if let Event::ZonePreview { range, cloud, model, .. } = e {
79 println!(" 초벌 {}: 조밀 점 {} / 희소 점 {}", range.zone, cloud.len(), model.num_points3d());
80 }
81 })
82 .on(EventKind::ZoneRefined, |e: &Event| {
83 if let Event::ZoneRefined { range, cloud, model, .. } = e {
84 println!(" 정밀 {}: 조밀 점 {} / 희소 점 {}", range.zone, cloud.len(), model.num_points3d());
85 }
86 })
87 .on_message(|k, m| eprintln!(" {k:?}: {m}"));
88 let mut pipeline = sinks::attach(pipeline, &out, &SinkOptions::default()).map_err(|e| e.to_string())?;
89
90 for p in 0..npos {
91 pipeline.push(Input::Frames(FrameSet::new(CAMS.iter().map(|c| (*c, layout.name(c, p))))));
92 }
93 let (_, summary) = pipeline.finish();
94 println!("이벤트 {} 개, 훅 호출 {} 번, 훅 패닉 {}", summary.events, summary.hook_calls, summary.hook_panics);
95
96 for f in ["timeline.txt", "run.log", "snapshots/manifest.json", "snapshots/timeline.txt", "DONE"] {
97 let p = out.join(f);
98 println!("{} {}", if p.exists() { "있음" } else { "없음" }, p.display());
99 }
100 Ok(())
101}Trait Implementations§
Auto Trait Implementations§
impl !RefUnwindSafe for DenseConfig
impl !UnwindSafe for DenseConfig
impl Freeze for DenseConfig
impl Send for DenseConfig
impl Sync for DenseConfig
impl Unpin for DenseConfig
impl UnsafeUnpin for DenseConfig
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> DistributionExt for Twhere
T: ?Sized,
impl<T> DistributionExt for Twhere
T: ?Sized,
impl<T, U> Imply<T> for U
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
The inverse inclusion map: attempts to construct
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
Checks if
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
Use with care! Same as
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
The inclusion map: converts
self to the equivalent element of its superset.