1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//! 왜곡 보정과 다시점 조밀화.
//!
//! - [`undistort`](mod@undistort): 왜곡 있는 카메라 → PINHOLE 카메라 계산, 카메라별 재표본 맵 캐시, 영상 재표본, 희소 모델 변환.
//! - [`image`]: 영상 버퍼와 재표본 도구.
//! - [`scene`]: 조밀화 장면(뷰 K·자세·영상, 희소점).
//! - [`neighbors`]: 이웃 뷰 선택과 깊이 범위.
//! - [`kernel`]: PatchMatch 백엔드 경계(한 스케일의 전파·뷰 선택·정제는 백엔드가 수행).
//! - [`densify`](mod@densify): 다중 스케일 진행, 세부 복원, 필터, 융합 연결.
//! - [`fusion`], [`fusion_score`]: 깊이맵 융합(일치·확장 중앙값·점수 융합).
//! - [`postproc`], [`upsample`], [`math`], [`params`]: 후처리, 상향 표본, 수치 도구, 설정.
//! - [`stats`]: 점군 품질 통계.
//! - [`cache`]: 겹치는 구역용 깊이맵 캐시.
//! - [`synthetic`]: 시험용 합성 장면.
//!
//! 이 크레이트에는 PatchMatch 백엔드 구현이 없다. [`densify()`] 에는 [`PatchMatchBackend`] 구현
//! (예: `cumulus3d-cuda` 의 GPU 백엔드 `CudaPatchMatch`)을 넘겨야 한다.
//!
//! # 사용 예
//!
//! 합성 장면의 참 깊이맵을 CPU 에서 융합한다(백엔드 불필요).
//!
//! ```
//! use cumulus3d_dense::neighbors::PairStats;
//! use cumulus3d_dense::synthetic::{make_scene, SynthConfig};
//! use cumulus3d_dense::{fuse, FusionInput, FusionParams};
//!
//! let cfg = SynthConfig { width: 96, height: 72, focal: 75.0, num_points: 500, ..SynthConfig::default() };
//! let s = make_scene(&cfg);
//! let stats = PairStats::new(&s.scene);
//! let overlap: Vec<Vec<usize>> = (0..s.scene.views.len()).map(|v| stats.select(v, 50, 0.0)).collect();
//! let inputs: Vec<Option<FusionInput>> =
//! s.depth.iter().zip(&s.normal).map(|(d, n)| Some(FusionInput::plain(d, n))).collect();
//! let out = fuse(&s.scene, &inputs, &overlap, &FusionParams::default(), 1);
//! assert!(out.cloud.len() > 0);
//! ```
//!
//! 실제 조밀화(왜곡 보정 → 장면 → 깊이맵 → 융합 → PLY). 백엔드는 GPU 구현을 넘긴다.
//!
//! ```no_run
//! use cumulus3d_dense::{densify, undistort_from_dir, DenseScene, DensifyOptions, PatchMatchBackend, SceneOptions, UndistortCache, UndistortOptions};
//!
//! fn run(backend: &dyn PatchMatchBackend) -> cumulus3d_core::Result<()> {
//! let rec = cumulus3d_core::interop::read_model("sparse/0")?;
//! let und = undistort_from_dir(&rec, "images", &UndistortOptions::pipeline(), &UndistortCache::new())?;
//! let scene = DenseScene::from_reconstruction(&und.reconstruction, &und.images, &SceneOptions::default())?;
//! let out = densify(&scene, &DensifyOptions::default(), backend, None)?;
//! out.write_ply("dense/fused.ply")?;
//! Ok(())
//! }
//! ```
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use PostParams;
pub use ;
pub use ;
pub use ;