Files
scan-calibrator/README.md
T
2026-07-24 11:32:08 +08:00

275 lines
9.1 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 # 完整手动流程和参数原理
├── 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下的水平/垂直视场。
请保持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. 每个方向用不同移动量反算视场:两组结果只有在特征质量高且视场差不超过8%时才接受,
否则要求至少三组一致结果;
6. 水平方向按1%目标重叠计算step,垂直方向按4%目标重叠计算step;
7. 要求至少50个几何内点且内点率至少45%,否则拒绝结果;
8. 删除本次自动标定产生的临时截图。
这一步不能省略。两个角点只能确定扫描范围,无法确定当前摄像头型号和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
```
扫描完成或失败后自动停止日志跟随,并显示结果目录。
### ⑧ 拼图测试
只有本次试扫成功完成后才会出现这个问题。回复`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;
- 水平目标重叠为1%,垂直目标重叠为4%,都不超过5%上限;
- 自动标定不会使用单个样本;两组样本必须同时满足高特征质量和视场差不超过8%,
普通质量的结果必须由至少三组样本互相验证;
- 机械回差、镜头畸变和近景视差可能导致不同位置略有差异,最终必须完整试扫并拼图复核;