pub struct FrameSet {
pub images: Vec<FrameImage>,
pub gps: Vec<GpsRecord>,
}Expand description
위치 하나의 프레임 묶음(카메라마다 한 장).
Fields§
§images: Vec<FrameImage>카메라별 영상.
gps: Vec<GpsRecord>이 묶음과 함께 들어온 GPS 기록(설정의 gps 뒤에 덧붙는다).
Implementations§
Source§impl FrameSet
impl FrameSet
Sourcepub fn new<C: Into<String>, N: Into<String>>(
images: impl IntoIterator<Item = (C, N)>,
) -> Self
pub fn new<C: Into<String>, N: Into<String>>( images: impl IntoIterator<Item = (C, N)>, ) -> Self
(카메라, 이름) 목록으로.
Examples found in repository?
examples/hooks.rs (line 63)
21fn main() -> Result<(), String> {
22 let out = std::env::args().nth(1).map(PathBuf::from).unwrap_or_else(|| std::env::temp_dir().join("cumulus3d_hooks"));
23 let src = out.with_extension("src");
24 if !src.join("gps_ref.txt").exists() {
25 common::make_dataset(&src);
26 }
27 if out.exists() {
28 std::fs::remove_dir_all(&out).map_err(|e| e.to_string())?;
29 }
30 let layout = Layout::discover(&src, 1)?;
31 let npos = layout.frames.len();
32
33 let mut cfg = SessionConfig::new(src.join("images"));
34 cfg.gps = read_gps_file(src.join("gps_ref.txt")).map_err(|e| e.to_string())?;
35 (cfg.span, cfg.overlap, cfg.total_positions, cfg.seed) = (4, 1, Some(npos), Some(7));
36 if cumulus3d_cuda::is_available() {
37 let mut d = DenseConfig::new(make_pm_backend("cuda"), parse_profile("fast")?);
38 d.undistort.max_image_size = 160;
39 cfg.dense = Some(d);
40 }
41
42 // 훅: 사건 문구 출력, 구역 점군 점 수, 경고·오류. 그리고 기본 출력 훅(파일).
43 let pipeline = Pipeline::new(Session::new(cfg))
44 .on_any(|e: &Event| {
45 if let Some(t) = e.timeline_text() {
46 println!("[event v{}] {t}", e.meta().version);
47 }
48 })
49 .on(EventKind::ZonePreview, |e: &Event| {
50 if let Event::ZonePreview { range, cloud, model, .. } = e {
51 println!(" 초벌 {}: 조밀 점 {} / 희소 점 {}", range.zone, cloud.len(), model.num_points3d());
52 }
53 })
54 .on(EventKind::ZoneRefined, |e: &Event| {
55 if let Event::ZoneRefined { range, cloud, model, .. } = e {
56 println!(" 정밀 {}: 조밀 점 {} / 희소 점 {}", range.zone, cloud.len(), model.num_points3d());
57 }
58 })
59 .on_message(|k, m| eprintln!(" {k:?}: {m}"));
60 let mut pipeline = sinks::attach(pipeline, &out, &SinkOptions::default()).map_err(|e| e.to_string())?;
61
62 for p in 0..npos {
63 pipeline.push(Input::Frames(FrameSet::new(CAMS.iter().map(|c| (*c, layout.name(c, p))))));
64 }
65 let (_, summary) = pipeline.finish();
66 println!("이벤트 {} 개, 훅 호출 {} 번, 훅 패닉 {}", summary.events, summary.hook_calls, summary.hook_panics);
67
68 for f in ["timeline.txt", "run.log", "snapshots/manifest.json", "snapshots/timeline.txt", "DONE"] {
69 let p = out.join(f);
70 println!("{} {}", if p.exists() { "있음" } else { "없음" }, p.display());
71 }
72 Ok(())
73}Trait Implementations§
Auto Trait Implementations§
impl Freeze for FrameSet
impl RefUnwindSafe for FrameSet
impl Send for FrameSet
impl Sync for FrameSet
impl Unpin for FrameSet
impl UnsafeUnpin for FrameSet
impl UnwindSafe for FrameSet
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.