# 运动相机地平线增稳算法 **Repository Path**: ibst/horizon ## Basic Information - **Project Name**: 运动相机地平线增稳算法 - **Description**: 运动相机地平线增稳算法 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-08 - **Last Updated**: 2026-01-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: 地平线, 增稳, 相机, IMU, 算法 ## README # 运动相机地平线增稳画面裁切工具 本工具是一个基于 Python 和 Tkinter 的桌面应用程序,用于演示运动相机在处理地平线增稳(Horizon Steady)时的数学计算逻辑与画面演变过程。 ## 🚀 核心功能 * **实时旋转补偿**:模拟相机 Roll 角(翻滚角)变化,展示画面如何通过反向旋转保持地平线水平。 * **动态放大算法**:演示如何通过动态调整缩放倍数(Scale)来消除因旋转产生的边缘黑边。 * **参数实时调节**:支持手动干预算法的核心参数(基础放大、补偿系数、裁切指数),观察其对画质和画幅的影响。 * **计算过程拆解**:实时输出从输入角度到最终有效画面比例的完整计算步骤。 * **图像处理与保存**:支持加载自定义图片,处理后保存为文件。 ## 🧮 算法逻辑说明 该演示工具的核心算法分为以下六个关键步骤: ### 1. 旋转补偿 (Rotation) ``` 旋转角度 = -θ ``` 通过反向旋转画面来抵消相机的物理 Roll 角抖动。 ### 2. 动态放大 (Zoom) ``` 放大倍数 = BaseZoom + |θ| × AngleCoeff ``` * **BaseZoom (基础放大)**:初始预留的缓冲空间,确保小角度下无黑边。 * **AngleCoeff (补偿系数)**:每度旋转额外增加的放大倍数,确保高角度下的画面完整性。 ### 3. 智能裁切 (Cropping) ``` 裁切比例 = min((|θ|/90)^exp × 100, 100) ``` 利用非线性指数函数(exp)计算旋转后超出 4:3 比例边界的画面损失比例。 ## 🛠️ 技术实现 * **图形界面**:使用 Python 标准库 Tkinter 构建跨平台桌面应用。 * **图像处理**:利用 PIL (Pillow) 库进行图像旋转、缩放和裁切。 * **算法核心**:纯原生 Python 实现实时数学运算与图像处理。 * **自适应设计**:支持自定义图片尺寸和输出格式。 ## 📦 安装与运行 ### 环境要求 * Python 3.6+ * Pillow 库 ### 安装步骤 1. 确保已安装 Python 3.6 或更高版本 2. 安装 Pillow 库: ```bash pip install Pillow ``` ### 运行程序 ```bash python horizon.py ``` ## 🎮 使用指南 ### 1. 基础操作 * **Roll角滑块**:手动调整倾斜角度(-90° 至 +90°) * **实时预览**:拖动滑块即可实时查看画面变化 * **图片加载**:点击"选择图片"按钮加载自定义图片 * **生成测试图**:点击"生成测试图"创建模拟画面 ### 2. 参数预设模式 | 模式 | 特点 | 参数建议 (base, coeff, exp) | | :--- | :--- | :--- | | **默认模式** | 适合大多数场景,平衡画质与稳定性 | 1.30, 0.006, 1.5 | | **激进模式** | 适合剧烈运动,确保无黑边,但画质损失较大 | 1.50, 0.012, 2.0 | | **保守模式** | 优先保留画质,适合轻微抖动场景 | 1.20, 0.003, 1.2 | ### 3. 保存结果 * 选择保存路径 * 点击"保存图片"按钮处理并保存当前画面 ## 📚 API 参考 ### HorizonStabilizer 类 提供静态方法用于计算裁切比例和生成测试图像。 #### calculate_shrink_ratio ```python @staticmethod def calculate_shrink_ratio(roll_angle, original_width, original_height): """ 计算画面收缩比例 参数: roll_angle: 翻滚角度(度) original_width: 原始图像宽度 original_height: 原始图像高度 返回: 收缩后的图像尺寸 """ ``` #### generate_test_image ```python @staticmethod def generate_test_image(width=800, height=600, pattern="landscape"): """ 生成测试用图像 参数: width: 图像宽度(默认800) height: 图像高度(默认600) pattern: 图案类型(默认"landscape") 返回: PIL Image 对象 """ ``` ### StabilizerApp 类 图形界面应用程序类,包含完整的 GUI 功能和图像处理逻辑。 主要方法: * `create_widgets()`: 创建界面组件 * `update_params()`: 更新参数设置 * `process_image()`: 处理图像 * `display_image()`: 显示图像 * `save_image()`: 保存图像 ## 🤝 贡献指南 欢迎提交 Issue 和 Pull Request 来改进本项目。 ## 📄 许可证 本项目遵循 MIT 许可证。 --- **实验建议**:尝试提高"基础放大倍数"到 1.50,观察低角度下的画质变化;或降低"角度系数"至 0.003,观察高角度旋转时是否会出现黑边。