Skip to main content

Crate cumulus3d_cli

Crate cumulus3d_cli 

Source
Expand description

cumulus3d 실행 파일의 라이브러리 부분: 점진 스트림 파이프라인과 단계별 호환 하위 명령(interop).

§사용 예

영상 폴더(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
기록·시간 측정·작은 직렬화 도우미.