colmap 0.1.2

A comprehensive Rust library for COLMAP-style computer vision and 3D reconstruction
Documentation
//! COLMAP Rust 库
//!
//! 这是一个用 Rust 实现的 COLMAP(Structure-from-Motion 和 Multi-View Stereo)库。
//! 提供了完整的 3D 重建管道,从图像特征提取到最终的密集 3D 模型生成。
//!
//! # 主要功能
//!
//! - **特征提取和匹配**:支持 SIFT、ORB、FAST 等多种特征检测算法
//! - **Structure from Motion (SfM)**:增量式稀疏 3D 重建
//! - **Multi-View Stereo (MVS)**:密集重建和点云生成
//! - **相机标定**:支持针孔、鱼眼等多种相机模型和畸变校正
//! - **几何验证**:RANSAC、本质矩阵估计等几何约束验证
//! - **束调整优化**:全局优化相机参数和 3D 点位置
//!
//! # 架构设计
//!
//! 库采用模块化设计,主要包含以下模块:
//!
//! - [`core`] - 核心数据结构和类型定义
//! - [`feature`] - 特征提取、描述符计算和匹配
//! - [`sfm`] - Structure from Motion 稀疏重建
//! - [`mvs`] - Multi-View Stereo 密集重建
//! - [`math`] - 数学工具和算法
//! - [`io`] - 数据输入输出
//! - [`utils`] - 通用工具函数
//!
//! # 快速开始
//!
//! ## 基本使用流程
//!
//! ```rust,ignore
//! use colmap::*;
//!
//! // 1. 创建相机模型
//! let intrinsics = CameraIntrinsics::pinhole(800.0, 800.0, 320.0, 240.0);
//! let camera = Camera::new(1, intrinsics, (640, 480), "Camera1".to_string());
//!
//! // 2. 特征提取
//! let pipeline = FeaturePipeline::new(PipelineConfig::default());
//! // let features = pipeline.extract_features(&images)?;
//!
//! // 3. SfM 重建
//! let sfm_config = SfmConfig::default();
//! let mut reconstructor = IncrementalSfm::new(sfm_config);
//! // let sparse_reconstruction = reconstructor.reconstruct(&images, &matches)?;
//!
//! // 4. MVS 密集重建
//! let mvs_config = MvsConfig::default();
//! let mvs_reconstructor = MvsReconstructor::new(mvs_config);
//! // let dense_reconstruction = mvs_reconstructor.reconstruct(&views)?;
//!
//! println!("重建完成!");
//! # Ok::<(), ColmapError>(())
//! ```
//!
//! ## 完整的重建示例
//!
//! ```rust,ignore
//! use colmap::*;
//! use std::path::Path;
//!
//! fn reconstruct_from_images(image_dir: &Path) -> Result<()> {
//!     // 1. 加载图像
//!     let images = load_images_from_directory(image_dir)?;
//!     
//!     // 2. 特征提取和匹配
//!     let feature_config = PipelineConfig {
//!         detector_type: DetectorType::Sift,
//!         max_features: 8000,
//!         ..Default::default()
//!     };
//!     
//!     let pipeline = FeaturePipeline::new(feature_config);
//!     let extraction_result = pipeline.extract_and_match_all(&images)?;
//!     
//!     println!("提取了 {} 个图像的特征", extraction_result.features.len());
//!     println!("找到 {} 个匹配对", extraction_result.matches.len());
//!     
//!     // 3. SfM 稀疏重建
//!     let sfm_config = SfmConfig {
//!         min_track_length: 2,
//!         max_reprojection_error: 4.0,
//!         ..Default::default()
//!     };
//!     
//!     let mut sfm_reconstructor = IncrementalSfm::new(sfm_config);
//!     sfm_reconstructor.set_features(extraction_result.features);
//!     sfm_reconstructor.set_matches(extraction_result.matches);
//!     
//!     let sparse_reconstruction = sfm_reconstructor.reconstruct()?;
//!     
//!     println!("稀疏重建统计:");
//!     println!("  - 注册图像: {}", sparse_reconstruction.registered_images());
//!     println!("  - 3D 点数量: {}", sparse_reconstruction.points.len());
//!     println!("  - 平均重投影误差: {:.2}", sparse_reconstruction.mean_reprojection_error());
//!     
//!     // 4. MVS 密集重建
//!     let mvs_config = MvsConfig {
//!         min_num_views: 3,
//!         max_image_size: 1600,
//!         depth_range: (0.1, 100.0),
//!         ..Default::default()
//!     };
//!     
//!     let mvs_reconstructor = MvsReconstructor::new(mvs_config);
//!     let views = prepare_views_from_reconstruction(&sparse_reconstruction)?;
//!     let dense_reconstruction = mvs_reconstructor.reconstruct(&views)?;
//!     
//!     println!("密集重建统计:");
//!     println!("  - 点云大小: {}", dense_reconstruction.point_cloud.points.len());
//!     println!("  - 网格三角形: {}", dense_reconstruction.mesh.triangles.len());
//!     
//!     // 5. 保存结果
//!     save_reconstruction(&sparse_reconstruction, "sparse_reconstruction")?;
//!     save_point_cloud(&dense_reconstruction.point_cloud, "dense_point_cloud.ply")?;
//!     save_mesh(&dense_reconstruction.mesh, "mesh.obj")?;
//!     
//!     Ok(())
//! }
//!
//! # fn load_images_from_directory(dir: &Path) -> Result<Vec<Image>> { todo!() }
//! # fn prepare_views_from_reconstruction(recon: &Reconstruction) -> Result<Vec<ViewInfo>> { todo!() }
//! # fn save_reconstruction(recon: &Reconstruction, path: &str) -> Result<()> { todo!() }
//! # fn save_point_cloud(cloud: &FusionResult, path: &str) -> Result<()> { todo!() }
//! # fn save_mesh(mesh: &TriangleMesh, path: &str) -> Result<()> { todo!() }
//! ```
//!
//! # 性能优化建议
//!
//! - 使用适当的图像尺寸(推荐 1600x1200 以下)
//! - 调整特征点数量以平衡质量和速度
//! - 对于大规模数据集,考虑分块处理
//! - 使用多线程处理独立的图像对
//!
//! # 错误处理
//!
//! 库使用统一的错误类型 [`ColmapError`],支持详细的错误信息:
//!
//! ```rust,no_run
//! use colmap::*;
//!
//! match reconstruct_scene() {
//!     Ok(reconstruction) => {
//!         println!("重建成功!");
//!     }
//!     Err(ColmapError::FeatureExtraction(msg)) => {
//!         eprintln!("特征提取失败: {}", msg);
//!     }
//!     Err(ColmapError::SfmReconstruction(msg)) => {
//!         eprintln!("SfM 重建失败: {}", msg);
//!     }
//!     Err(e) => {
//!         eprintln!("其他错误: {}", e);
//!     }
//! }
//!
//! # fn reconstruct_scene() -> Result<Reconstruction> { todo!() }
//! ```

pub mod core;
pub mod feature;
pub mod sfm;
pub mod mvs;
pub mod math;
pub mod io;
pub mod utils;

// 重新导出主要类型和函数
pub use core::*;
pub use feature::*;
pub use sfm::*;
pub use mvs::*;

/// 库版本信息
pub const VERSION: &str = env!("CARGO_PKG_VERSION");

/// 库名称
pub const NAME: &str = env!("CARGO_PKG_NAME");

/// 获取库信息
pub fn info() -> String {
    format!("{} v{}", NAME, VERSION)
}

#[cfg(test)]
mod tests {
    use super::*;

    use nalgebra::Point2;

    #[test]
    fn test_library_info() {
        let info = info();
        assert!(info.contains("colmap"));
        assert!(info.contains("0.1.2"));
    }

    #[test]
    fn test_camera_creation() {
        let intrinsics = CameraIntrinsics::pinhole(800.0, 800.0, 320.0, 240.0);
        let camera = Camera::new(1, intrinsics, (640, 480), "TestCamera".to_string());
        
        assert_eq!(camera.id, 1);
        assert_eq!(camera.image_size, (640, 480));
        assert!(!camera.is_registered());
    }

    #[test]
    fn test_feature_creation() {
        let point = Point2::new(100.0, 200.0);
        let descriptor = vec![1, 2, 3, 4];
        let feature = Feature::simple(point, descriptor.clone());
        
        assert_eq!(feature.point, point);
        assert_eq!(feature.descriptor, descriptor);
        assert!(!feature.is_triangulated());
    }
}