Files
scan-calibrator/README.md
T
2026-07-29 16:25:16 +08:00

305 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# scan参数交互式配置向导
该工具用于在不同摄像头点位通过固定对话完成scan参数标定、配置替换、完整试扫和验证拼图,
适合批量部署RK3588。详细的底层命令和原理见[手动配置README.md](./手动配置README.md)。
## 目录结构
```text
scan-calibrator/
├── README.md # 交互式向导主文档
├── 手动配置README.md # 完整手动流程和参数原理
├── install.sh # 首次部署时安装依赖并做完整环境自检
├── 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/ # 运行时生成的验证大图
```
## 启动
首次把本目录复制到一台RK3588后,先执行一次安装与自检:
```bash
cd /home/zhangw/scan-calibrator
./install.sh
./interactive.sh
```
`install.sh`可重复运行,不会修改scan参数。它会在缺少时通过`apt-get`安装宿主机
`python3`和`imagemagick`,然后检查Docker、smart-cam容器、scan HTTP服务、数据目录写权限、
容器内C++/OpenCV编译环境以及拼图命令。非root账号安装缺失软件时需要具有`sudo`权限。
如果设备上曾出现“未找到ImageMagick identify”,就是宿主机缺少`imagemagick`;
运行`install.sh`会自动补齐。ImageMagick安装在RK3588宿主机,而不是smart-cam容器内,
因为验证拼图程序运行在宿主机。
只需要输入:
- `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下的水平/垂直视场。
请保持zoom不变,优先把摄像头移到扫描区域内部、距离较远且纹理分布在整幅画面的位置。
请避开纯天空、纯墙面、水面、玻璃、近距离物体和重复图案;
回复1后不要再操作Web云台,程序会自动移动、拍照并返回起点。
到位后回复 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": 19870,
"pan_step": 1075,
"tilt_start": -340,
"tilt_end": 1511,
"tilt_step": 617,
"zoom": 810
}
安装方式:desktop
范围检查:视觉左→右pan=decreasing,指定弧段=57.00°
整步扩边:pan_step=1075,向终点外扩=750(7.50°)
整步扩边: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
现场人员保持zoom不变,把镜头移到扫描区域内部、距离较远且纹理丰富的位置。
回复`1`后,向导会:
1. 抓取基准图;
2. 沿pan方向尝试若干候选角度,每次抓图后回到起点;
3. 用ORB特征、RANSAC和单轴画面位移求水平视场;
4. 沿tilt方向重复测量;
5. 每个方向会跑完预设的全部候选step,再统一筛选相互一致的视场样本;不因前几个样本
离散度低而提前停止;
6. 两组结果只有在特征质量高且视场差不超过8%时才接受,否则要求至少三组一致结果;
7. 水平方向按4%、垂直方向按2%目标重叠计算step;这是根据完整扫图接缝分别设置的轴向补偿;
8. 默认使用ORB特征和RANSAC几何变换;当局部图案重复导致几何内点不足时,自动使用整幅图
相位相关复核纯单轴位移,相位响应不得低于0.20;
8. 要求至少50个几何内点且内点率至少45%,否则拒绝结果;
9. 根据多个水平样本的带符号位移,自动识别该型号摄像头从画面左到右时pan是递增还是递减;
10. 删除本次自动标定产生的临时截图。
这一步不能省略。两个角点只能确定扫描范围,无法确定当前摄像头型号和zoom下的一幅画面
覆盖多少角度。
不要把画面对准纯天空、纯墙、水面、玻璃、近距离物体或重复图案,否则无法可靠匹配。
这一步不能改变zoom;自动对焦不影响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
```
扫描完成或失败后自动停止日志跟随,并显示结果目录。
扫描过程中需要中断时,直接按`Ctrl+C`。向导会主动调用停止接口并结束本次扫描,
已经保存的小图和`meta.json`会保留。也可以在另一个终端执行:
```bash
docker exec smart-cam curl -fsS -X POST \
http://127.0.0.1:18080/api/v1/scan/stop
```
### ⑧ 拼图测试
只有本次试扫成功完成后才会出现这个问题。回复`1`后,向导将本次扫描的结果目录和第①步
选择的安装方式传给:
```bash
/home/zhangw/scan-calibrator/scan-panorama/stitch.sh \
<本次扫描目录> --mount <desktop或hanging> \
--pan-direction <increasing或decreasing>
```
`mount`只决定上下行顺序;左右列顺序使用第④步实拍得到的pan方向。交互式向导会自动传入,
不需要现场人员额外选择。
拼图完成后,终端返回大图的绝对存储路径,然后结束对话。回复`3`则不拼图并结束。
拼图结果统一保存在:
```text
/home/zhangw/scan-calibrator/scan-panorama/result/
```
应打开大图检查实际拼图是否存在超过5%的重叠或画面缺口。
## 批量部署注意事项
- 每一个摄像头点位都要重新记录角点;
- 摄像头型号或zoom变化时必须重新自动计算step;
- 不同型号的海康球机可能有相反的pan数值方向;向导会实拍识别,不能用desktop/hanging
或“默认走短弧”代替;
- 标定期间不要同时从Web界面控制PTZ;
- 向导按轴设置目标重叠:水平4%、垂直2%;最终以完整试扫的接缝结果为准;
- 自动标定会完整测试全部候选step,再从所有可靠结果中筛选一致样本;
- 机械回差、镜头畸变和近景视差可能导致不同位置略有差异,最终必须完整试扫并拼图复核;