# Camera 模块使用文档 ## 概述 Camera 模块是一个完整的相机控制和管理系统,提供了高级API用于配置、捕获、存储和处理相机帧。该模块主要用于天文观测系统,特别是流星检测,但它的设计足够灵活,可以用于任何需要视频捕获和处理的应用。 模块主要功能包括: - 相机设备初始化和配置 - 实时视频流捕获 - 高效的帧缓冲管理 - 视频事件存储和处理 - 相机健康监控 ## 核心组件 ### 1. CameraController `CameraController` 是主要的控制接口,它管理相机的整个生命周期和操作流程。 主要特性: - 初始化和配置相机设备 - 启动和停止视频流捕获 - 管理帧缓冲 - 提供帧订阅机制 - 保存流星事件和相关视频 - 监控相机健康状态 ### 2. OpenCVCamera `OpenCVCamera` 是相机硬件的具体驱动实现,基于OpenCV库。 主要特性: - 支持各种相机设备(通过路径或索引) - 配置相机分辨率、帧率、曝光和增益 - 控制相机聚焦 - 视频流管理 ### 3. Frame 和 FrameBuffer `Frame` 表示单个捕获的视频帧,包含图像数据、时间戳和元数据。 `FrameBuffer` 是一个高效的循环缓冲区,用于存储最近捕获的视频帧。 主要特性: - 管理固定容量的帧缓冲 - 提供索引和时间范围的帧检索 - 提取特定事件周围的帧 ## 关键数据结构 ### CameraSettings ```rust pub struct CameraSettings { pub device: String, // 相机设备路径或索引 pub resolution: Resolution, // 分辨率设置 pub fps: u32, // 每秒帧数 pub exposure: ExposureMode, // 曝光模式 pub gain: u8, // 增益/ISO设置 (0-255) pub focus_locked: bool, // 是否锁定无限远焦点 } ``` ### Resolution ```rust pub enum Resolution { HD1080p, // 1920x1080 HD720p, // 1280x720 VGA, // 640x480 Custom { // 自定义分辨率 width: u32, height: u32, }, } ``` ### ExposureMode ```rust pub enum ExposureMode { Auto, // 自动曝光控制 Manual(u32), // 手动曝光控制,以微秒为单位 } ``` ### MeteorEvent ```rust pub struct MeteorEvent { pub id: uuid::Uuid, // 事件唯一标识符 pub timestamp: DateTime, // 事件检测时间戳 pub confidence: f32, // 置信度分数 (0.0-1.0) pub bounding_box: (u32, u32, u32, u32), // 图像中的坐标 (左上x, 左上y, 宽度, 高度) pub video_path: String, // 保存的视频剪辑路径 } ``` ## 使用流程 典型的使用流程包括以下步骤: 1. 创建和配置相机控制器 2. 初始化相机设备 3. 启动视频捕获 4. 订阅帧更新(可选) 5. 处理捕获的帧 6. 保存检测到的事件 7. 停止捕获并清理资源 ## 示例代码 请参考 `examples/camera_demo.rs` 示例,了解更详细的使用方法。 ## 注意事项 1. **设备兼容性**:该模块主要支持Linux和macOS上的相机设备。在其他平台上可能需要额外的配置。 2. **资源管理**:由于视频捕获可能消耗大量内存,特别是在高分辨率和高帧率下,请确保合理配置帧缓冲区大小。 3. **依赖项**:该模块依赖于OpenCV库进行图像处理和视频捕获,请确保系统已正确安装相应的依赖项。 4. **错误恢复**:模块包含错误检测和恢复机制,但在关键应用中仍应实施额外的监控和故障恢复策略。 5. **性能考虑**:考虑系统资源限制,特别是在嵌入式设备上,应谨慎选择分辨率、帧率和缓冲区大小。 ## 高级特性 ### 帧订阅 模块使用tokio的广播通道实现了实时帧通知机制: ```rust // 订阅帧更新 let mut frame_receiver = camera_controller.subscribe_to_frames(); // 在单独的任务中处理帧 tokio::spawn(async move { while let Ok(frame) = frame_receiver.recv().await { // 处理新帧 } }); ``` ### 事件存储 当检测到流星时,可以保存相关视频剪辑: ```rust let event = camera_controller.save_meteor_event( timestamp, // 事件发生时间 0.95, // 置信度 (100, 200, 50, 30), // 边界框 (x, y, 宽度, 高度) 5, // 事件前5秒 3 // 事件后3秒 ).await?; ``` ### 健康监控 可以使用健康检查功能监控相机状态: ```rust let is_healthy = camera_controller.check_health().await?; if !is_healthy { // 实施恢复策略 } ``` ## 故障排除 ### 常见问题 1. **无法打开相机设备** - 检查设备路径或索引是否正确 - 确认设备有适当的访问权限 - 验证设备未被其他应用程序使用 2. **分辨率/帧率设置无效** - 不是所有相机都支持所有分辨率和帧率组合 - 检查相机规格和支持的格式 - 使用更保守的值或尝试自定义分辨率 3. **帧捕获停止或间歇性失败** - 可能是相机硬件问题 - 检查USB连接或电源问题 - 考虑重新初始化或重启相机 4. **内存使用过高** - 减小帧缓冲区容量 - 降低分辨率或帧率 - 确保正确处理和释放不再需要的帧 ### 诊断工具 使用`get_status()`方法获取详细的相机状态信息: ```rust let status = camera_controller.get_status().await?; println!("Camera status: {}", status); ``` ## 性能优化建议 1. 根据实际需求选择分辨率,无需使用高于实际需要的分辨率 2. 仅在必要时处理帧,避免冗余的图像处理操作 3. 使用帧订阅机制进行异步处理,避免阻塞主循环 4. 在资源受限的系统上,考虑使用区域感兴趣(ROI)处理帧子区域 5. 对于长时间运行的应用,定期检查健康状态并实施自动恢复机制