Expand description
cumulus3d 실행 파일의 라이브러리 부분: 점진 스트림 파이프라인과 단계별 호환 하위 명령(interop).
session: 상태 값session::Session과 리듀서 함수session::step/session::poll/session::command/session::finish.pipeline: 리듀서를 감싸 훅·큐 정책·패닉 격리·구독 채널을 제공하는pipeline::Pipeline.events: 단계별 결과events::Event와 명령events::Command.sinks:cumulus3d stream의 파일 출력(timeline.txt, run.log, PLY, 스냅샷)을 만드는 기본 훅.stream: 입력 폴더 → 세션 → 파이프라인 조립(stream::run_stream).
§사용 예
영상 폴더(images/camF|camR|camL/*.jpg, gps_ref.txt)를 위치 단위로 넣어 점진 재구성하고,
기본 출력 훅으로 cumulus3d stream 과 같은 파일을 만든다.
use cumulus3d_cli::events::{Event, EventKind};
use cumulus3d_cli::pipeline::Pipeline;
use cumulus3d_cli::session::{Input, Session, SessionConfig};
use cumulus3d_cli::sinks::{self, SinkOptions};
use cumulus3d_cli::stream::{frame_set, Layout};
use cumulus3d_core::io::read_gps_file;
use std::path::Path;
fn main() -> Result<(), String> {
let src = Path::new("data");
let layout = Layout::discover(src, 3)?;
let mut cfg = SessionConfig::new(src.join("images"));
cfg.gps = read_gps_file(src.join("gps_ref.txt")).map_err(|e| e.to_string())?;
cfg.total_positions = Some(layout.frames.len());
let pipeline = Pipeline::new(Session::new(cfg)).on(EventKind::ZonePreview, |e: &Event| {
if let Event::ZonePreview { range, cloud, .. } = e {
println!("초벌 구역 {}: 점 {}", range.zone, cloud.len());
}
});
let mut pipeline = sinks::attach(pipeline, Path::new("out"), &SinkOptions::default()).map_err(|e| e.to_string())?;
for p in 0..layout.frames.len() {
pipeline.push(Input::Frames(frame_set(&layout, p)));
}
let (_session, summary) = pipeline.finish();
println!("이벤트 {} 개", summary.events);
Ok(())
}훅 없이 상태 값만 주고받는 함수형 사용:
use cumulus3d_cli::session::{finish, step, FrameSet, Session, SessionConfig};
let s0 = Session::new(SessionConfig::new("data/images"));
let frames = FrameSet::new([("camF", "camF/camF_0000.jpg"), ("camR", "camR/camR_0000.jpg")]);
let (s1, events) = step(&s0, frames);
for e in &events {
if let Some(t) = e.timeline_text() {
println!("{t}");
}
}
let (_done, _summary_events) = finish(&s1);Modules§
- densewrap
- 조밀화 공용 경로: 구역 밖 영상 제외 → 왜곡 보정 → 장면 변환 → densify.
스트림과
densify하위 명령이 함께 쓴다. - events
- 파이프라인 이벤트. 새 프레임 묶음이 처리될 때마다 단계별로 분해된 결과를 내보낸다. 이 파일은 세 모듈(session·pipeline·sinks)의 공용 계약이다. 필드 추가는 가능, 기존 필드 변경·삭제는 금지.
- fusion_
variants densify --fusion-variants <파일>: 깊이맵은 한 번만 만들고 융합 설정만 바꿔 여러 번 융합한다.- interop
- 외부 SfM 도구(COLMAP) 단계별 명령 호환 하위 명령(얇은 래퍼). 하위 명령 이름과 옵션 문자열은 그 도구의 명령줄을 따른다.
단계 사이 상태는
--database_path(FeatureStore 이진 파일)와 모델 폴더(cumulus3d_core::interop형식)로 잇는다. GPU 관련 옵션(--FeatureExtraction.use_gpu등)은 받기만 하고 무시한다. - pipeline
- 람다 훅 파이프라인(
Pipeline): 훅 등록·큐·정책·패닉 격리·채널. - post
- 후처리: 스크립트 끝의 파이썬 부분(초벌 정렬·사건별 스냅샷·manifest)과 incremental_reanchor.py 를 align 크레이트로 수행한다. 모델은 메모리의 Reconstruction 을 그대로 쓴다.
- session
- 상태 값과 리듀서:
Session+step/poll/command/finish. - sinks
- 기본 출력 훅: 이벤트를 받아
cumulus3d stream의 파일 출력을 만든다. - stream
cumulus3d stream: 입력 폴더의 위치를 하나씩Session리듀서에 넣고(Pipeline), 기본 출력 훅(crate::sinks)이 timeline.txt·run.log·점군·스냅샷 파일을 만든다. 계산(특징 → 짝 매칭 → 첫 모델/이어 등록 → 구역별 초벌·정밀)은crate::session에 있다.- util
- 기록·시간 측정·작은 직렬화 도우미.