266 lines
8.4 KiB
Markdown
266 lines
8.4 KiB
Markdown
# scan参数交互式配置向导
|
||
|
||
该工具用于在不同摄像头点位通过固定对话完成scan参数标定、配置替换、完整试扫和验证拼图,
|
||
适合批量部署RK3588。详细的底层命令和原理见[手动配置README.md](./手动配置README.md)。
|
||
|
||
## 目录结构
|
||
|
||
```text
|
||
scan-calibrator/
|
||
├── README.md # 交互式向导主文档
|
||
├── 手动配置README.md # 完整手动流程和参数原理
|
||
├── interactive.sh # 交互式向导入口
|
||
├── interactive_calibrator.py
|
||
├── calibrate.sh # 手动配置入口
|
||
├── scan_calibrator.py
|
||
├── src/measure_overlap.cpp
|
||
├── result/ # 运行时生成的scan配置片段
|
||
└── scan-panorama/
|
||
├── stitch.sh
|
||
├── stitch_scan.py
|
||
├── README.md
|
||
└── result/ # 运行时生成的验证大图
|
||
```
|
||
|
||
## 启动
|
||
|
||
```bash
|
||
cd /home/zhangw/scan-calibrator
|
||
./interactive.sh
|
||
```
|
||
|
||
只需要输入:
|
||
|
||
- `1`:确认、执行或选择野外部署;
|
||
- `2`:只在第一个问题中表示办公室测试;
|
||
- `3`:结束对话,并清理本次未完成向导生成的标定状态和临时标定截图;
|
||
- `Ctrl+C`:等同于退出。
|
||
|
||
退出不会删除历史扫描目录,也不会回滚已经明确确认替换并重启的`config.json`。
|
||
|
||
## 完整对话示例
|
||
|
||
下面以办公室测试、28张小图为例。`>`后面的`1`或`2`是现场人员输入;PTZ、step、
|
||
文件名和扫描目录只是示例,实际值由当前摄像头返回。
|
||
|
||
```text
|
||
您好!我们现在开始配置扫图参数!
|
||
在接下来的对话中,回复 3 会立即结束,并清理本次向导产生的标定痕迹。
|
||
|
||
① 当前是【野外部署阶段】(回复 1)还是【办公室测试阶段】(回复 2)?
|
||
> 2
|
||
|
||
② 请在Web界面中固定本次扫描使用的zoom,再手动把摄像头移到扫描区域的【左上角】。
|
||
到位后回复 1;回复 3 随时退出。
|
||
> 1
|
||
已读取: pan=19120 (191.20°), tilt=990 (9.90°), zoom=810 (8.10×)
|
||
|
||
③ 请保持zoom不变,手动把摄像头移到扫描区域的【右下角】。
|
||
到位后回复 1;回复 3 随时退出。
|
||
> 1
|
||
已读取: pan=13420 (134.20°), tilt=-340 (-3.40°), zoom=810 (8.10×)
|
||
|
||
④ 请保持zoom不变,把摄像头移到扫描区域中央、距离较远且纹理丰富的位置。
|
||
请避开纯天空、纯墙面、水面、玻璃和重复图案;确认后程序会自动移动、拍照并计算step。
|
||
到位后回复 1;回复 3 随时退出。
|
||
> 1
|
||
|
||
正在计算,请不要操作摄像头或Web控制页面……
|
||
已读取: pan=16220 (162.20°), tilt=440 (4.40°), zoom=810 (8.10×)
|
||
|
||
正在标定 pan_step,摄像头会自动移动并回到起点……
|
||
step=250: 重叠约 77.0%,有效特征=286,内点率=91.7%
|
||
step=450: 重叠约 58.6%,有效特征=191,内点率=84.5%
|
||
step=700: 重叠约 35.5%,有效特征=116,内点率=73.9%
|
||
|
||
正在标定 tilt_step,摄像头会自动移动并回到起点……
|
||
step=120: 重叠约 81.3%,有效特征=302,内点率=92.0%
|
||
step=220: 重叠约 65.8%,有效特征=215,内点率=86.7%
|
||
step=350: 重叠约 45.6%,有效特征=143,内点率=78.1%
|
||
|
||
⑤ 本次得到的扫图参数:
|
||
{
|
||
"pan_start": 13420,
|
||
"pan_end": 19672,
|
||
"pan_step": 1042,
|
||
"tilt_start": -340,
|
||
"tilt_end": 1511,
|
||
"tilt_step": 617,
|
||
"zoom": 810
|
||
}
|
||
安装方式:desktop
|
||
范围检查:视觉左→右pan=decreasing,指定弧段=57.00°
|
||
整步扩边:pan_step=1042,向终点外扩=552(5.52°)
|
||
整步扩边:tilt_step=617,向终点外扩=521(5.21°)
|
||
预计网格:7列 × 4行 = 28张
|
||
|
||
⑥ 是否替换 smart-cam 容器内的/smart-cam/config/config.json?
|
||
替换并重启回复 1;不替换并结束回复 3。
|
||
> 1
|
||
替换完成,smart-cam已重启。
|
||
|
||
⑦ 是否现在进行一次完整扫图测试?
|
||
开始测试回复 1;不测试并结束回复 3。
|
||
> 1
|
||
已启动测试扫描。
|
||
|
||
扫图日志:
|
||
已保存第 1/28 张图
|
||
已保存第 2/28 张图
|
||
……
|
||
已保存第 27/28 张图
|
||
已保存第 28/28 张图
|
||
|
||
扫描完成,共保存 28 张图。
|
||
保存目录:/smart-cam/data/scan/2026-07-23_16-53-51
|
||
|
||
⑧ 本次扫描已完成,是否立即进行拼图测试?
|
||
开始拼图回复 1;不拼图并结束回复 3。
|
||
> 1
|
||
|
||
拼图完成。
|
||
大图存储位置:/home/zhangw/scan-calibrator/scan-panorama/result/2026-07-23_16-53-51_desktop_scan_grid_panorama.jpg
|
||
|
||
配置向导已完成,对话结束。
|
||
```
|
||
|
||
## 每个问题背后执行了什么
|
||
|
||
### ① 选择部署环境
|
||
|
||
- 回复`1`:使用`hanging`,表示球机在野外正常倒挂;
|
||
- 回复`2`:使用`desktop`,表示办公室桌面正放且摄像头后台旋转了180度。
|
||
|
||
它决定角点的pan方向和生成配置时的扫描顺序,等价于最后执行:
|
||
|
||
```bash
|
||
./calibrate.sh generate --mount hanging
|
||
# 或
|
||
./calibrate.sh generate --mount desktop
|
||
```
|
||
|
||
### ② 记录左上角
|
||
|
||
现场人员先在Web界面设置固定zoom,并移动到扫描区域左上角。回复`1`后,向导通过
|
||
smart-cam的HTTP接口读取PTZ并记录,等价于:
|
||
|
||
```bash
|
||
./calibrate.sh ptz
|
||
./calibrate.sh mark top-left
|
||
```
|
||
|
||
记录的是当前画面中心的`pan/tilt/zoom`。
|
||
|
||
### ③ 记录右下角
|
||
|
||
保持zoom不变,移动到右下角。回复`1`后等价于:
|
||
|
||
```bash
|
||
./calibrate.sh ptz
|
||
./calibrate.sh mark bottom-right
|
||
```
|
||
|
||
向导会比较两个角点的zoom;不一致时立即停止,避免用不同视场计算网格。
|
||
|
||
### ④ 自动计算pan_step和tilt_step
|
||
|
||
现场人员把镜头移到扫描区域中央、距离较远且纹理丰富的位置。回复`1`后,向导会:
|
||
|
||
1. 抓取基准图;
|
||
2. 沿pan方向尝试若干候选角度,每次抓图后回到起点;
|
||
3. 用ORB特征、RANSAC和单轴画面位移求水平视场;
|
||
4. 沿tilt方向重复测量;
|
||
5. 按`step = 视场 × (1 - 0.04)`计算目标重叠4%的step;
|
||
6. 要求至少50个几何内点且内点率至少45%,否则拒绝结果;
|
||
7. 删除本次自动标定产生的临时截图。
|
||
|
||
这一步不能省略。两个角点只能确定扫描范围,无法确定当前摄像头型号和zoom下的一幅画面
|
||
覆盖多少角度。
|
||
|
||
不要把画面对准纯天空、纯墙、水面、玻璃、近距离物体或重复图案,否则无法可靠匹配。
|
||
|
||
### ⑤ 显示最终参数
|
||
|
||
向导按完整step向终点扩展扫描范围,保证范围只能比手动选择的区域稍大,不能少扫。
|
||
它会显示:
|
||
|
||
```text
|
||
pan_start / pan_end / pan_step
|
||
tilt_start / tilt_end / tilt_step
|
||
zoom
|
||
预计行数、列数、图片总数和向外扩展角度
|
||
```
|
||
|
||
同时将片段保存到:
|
||
|
||
```text
|
||
/home/zhangw/scan-calibrator/result/
|
||
```
|
||
|
||
### ⑥ 替换配置并重启
|
||
|
||
回复`1`后,向导会:
|
||
|
||
1. 从容器读取`/smart-cam/config/config.json`;
|
||
2. 只更新`scan`中的七个运动参数,保留定时时间、等待时间、容差和HTTP设置;
|
||
3. 用`python3 -m json.tool`验证新JSON;
|
||
4. 原子替换配置,不另外备份原配置;
|
||
5. 执行`docker restart smart-cam`;
|
||
6. 等待scan HTTP服务重新可用。
|
||
|
||
回复`3`不会替换配置。
|
||
|
||
### ⑦ 立即完整试扫
|
||
|
||
回复`1`等价于:
|
||
|
||
```bash
|
||
docker exec smart-cam curl -fsS -X POST \
|
||
http://127.0.0.1:18080/api/v1/scan/start
|
||
```
|
||
|
||
向导会在后台轮询扫描状态,但不会把HTTP请求日志显示到终端。终端只显示图片保存进度:
|
||
|
||
```text
|
||
已保存第 1/28 张图
|
||
已保存第 2/28 张图
|
||
……
|
||
```
|
||
|
||
后台状态查询等价于:
|
||
|
||
```bash
|
||
docker exec smart-cam curl -fsS \
|
||
http://127.0.0.1:18080/api/v1/scan/status
|
||
```
|
||
|
||
扫描完成或失败后自动停止日志跟随,并显示结果目录。
|
||
|
||
### ⑧ 拼图测试
|
||
|
||
只有本次试扫成功完成后才会出现这个问题。回复`1`后,向导将本次扫描的结果目录和第①步
|
||
选择的安装方式传给:
|
||
|
||
```bash
|
||
/home/zhangw/scan-calibrator/scan-panorama/stitch.sh \
|
||
<本次扫描目录> --mount <desktop或hanging>
|
||
```
|
||
|
||
拼图完成后,终端返回大图的绝对存储路径,然后结束对话。回复`3`则不拼图并结束。
|
||
|
||
拼图结果统一保存在:
|
||
|
||
```text
|
||
/home/zhangw/scan-calibrator/scan-panorama/result/
|
||
```
|
||
|
||
应打开大图检查实际拼图是否存在超过5%的重叠或画面缺口。
|
||
|
||
## 批量部署注意事项
|
||
|
||
- 每一个摄像头点位都要重新记录角点;
|
||
- 摄像头型号或zoom变化时必须重新自动计算step;
|
||
- 标定期间不要同时从Web界面控制PTZ;
|
||
- 向导目标是4%重叠,为5%上限保留1%误差;
|
||
- 机械回差、镜头畸变和近景视差可能导致不同位置略有差异,最终必须完整试扫并拼图复核;
|