全景图拼接 (Panorama Stitch)
将多张重叠拍摄的照片自动拼接成一张宽幅全景图,支持特征匹配对齐、透视变换与接缝融合。
适用场景
- 手机或相机水平/垂直转动连续拍摄的多张照片,需要合并成全景图
- 用户说"全景拼接" / "接片" / "拼图" / "panorama" / "stitch" / "缝合"
- 扫描长文档时分段拍摄的多张照片,需要拼成完整文档
- 需要将多张有重叠区域的照片合并为一张宽幅图像
依赖
- Python >= 3.8
- numpy >= 1.20
- opencv-python-headless >= 4.5
安装依赖:
pip install numpy opencv-python-headless
使用流程
- 接收用户上传的多张重叠照片(至少 2 张)
- 按文件名排序确保拼接顺序正确
- 运行脚本进行拼接:
bash python <skill_dir>/scripts/panorama_stitch.py <img1.jpg> <img2.jpg> [img3.jpg ...] -o <output.jpg> [--mode panorama|scan] [--no-crop] - 用
present_files展示结果
处理流程
接收多张照片 → 按文件名排序 → 特征匹配对齐 → 接缝融合 → 裁切黑边 → 输出全景图
参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
inputs |
str[] | 必填 | 输入图片路径,至少 2 张,按文件名自动排序 |
-o, --output |
str | ./panorama.jpg |
输出图片路径 |
--mode |
str | panorama |
拼接模式:panorama 全景透视模式,scan 平面扫描模式(适合扫描文档) |
--no-crop |
flag | 关闭 | 不自动裁切黑边 |
模式选择
panorama(默认):适合相机旋转拍摄的全景照片,使用透视变换模型scan:适合平面扫描(如文档、白板),使用仿射变换模型,变形更小
技术要点
双引擎拼接
- 优先 OpenCV Stitcher:调用
cv2.Stitcher内置的高质量拼接管线(特征检测、匹配、 bundle 调整、多频带融合),速度快、效果好 - 手动回退:当 Stitcher 失败(重叠不足、场景纹理单一等)时,自动回退到手动 SIFT 管线
手动 SIFT 回退管线
- SIFT 特征检测:对相邻图片提取 SIFT 特征点与描述子
- FLANN 匹配 + Lowe 比率测试:KNN 匹配后用 0.7 比率筛选优质匹配
- RANSAC 单应性矩阵:
cv2.findHomography鲁棒估计透视变换 - 链式变换:逐对计算单应性矩阵并链式累加,将所有图片映射到统一坐标系
- 多频带融合:拉普拉斯金字塔 + 高斯权重掩码,消除接缝实现平滑过渡
黑边裁切
透视变换后画布边缘会产生黑色区域,通过最大内接矩形算法(直方图 + 单调栈)自动找到非零像素的最大矩形区域并裁切。
不适用场景
- 完全无重叠的照片(无法特征匹配)
- 拍摄角度差异过大(超过 60 度)的照片
- 运动物体较多的场景(可能产生鬼影)
- 鱼眼镜头拍摄的超广角照片(畸变模型不匹配)
- 仅需要 2D 平移对齐的场景(建议用景深合成或 HDR 合成技能)
文件结构
panorama-stitch/
├── SKILL.md # 技能说明文档(本文件)
└── scripts/
└── panorama_stitch.py # 全景拼接脚本(OpenCV Stitcher + SIFT 手动回退)