OptimizeAT - 控制点约束的空三优化
概述
OptimizeAT 接口用于使用控制点优化空中三角测量结果。该接口在完成刺点(tie point measurement)后调用,通过引入地面控制点(GCP)提高空三的绝对精度。
适用场景
- 需要高绝对精度的测绘项目
- 有地面控制点数据
- 需要验证和提高空三精度
- 工程测量和专业制图
工作流程
接口调用
命令行调用
reconstruct_full_engine.exe -reconstruct_type 3 -task_json optimize_config.json
参数说明
reconstruct_type
: 固定为3
(表示 OptimizeAT)task_json
: 配置文件路径
配置参数
OptimizeAT 使用与 ReconstructAT 相同的参数,额外增加控制点参数:
必需参数
所有 ReconstructAT 的必需参数,加上:
参数名 | 类型 | 说明 |
---|---|---|
control_point | JSON | 控制点组信息 |
控制点数据结构
ControlPointGroup
{
"coordinate_system": { // 控制点坐标系
"type": 3, // 通常为投影坐标系
"epsg_code": 32650 // 如 UTM Zone 50N
},
"points": [ // 控制点列表
// ControlPoint 对象数组
]
}
ControlPoint
{
"id": "GCP001", // 控制点名称
"coordinate": [x, y, z], // 控制点坐标
"usage": 0, // 0=控制点, 1=检查点, 2=禁用
"observations": [ // 图像观测值
{
"id": 1, // 图像 ID
"uv": [1234.5, 2345.6] // 像素坐标
}
]
}
完整配置示例
基础控制点优化
{
"license_id": 9200,
"working_dir": "C:/Projects/AT_Optimize",
"gdal_folder": "C:/MipMap/SDK/data",
"coordinate_system": {
"type": 2,
"epsg_code": 4326
},
"camera_meta_data": [...], // 与 ReconstructAT 相同
"image_meta_data": [...], // 与 ReconstructAT 相同
"control_point": {
"coordinate_system": {
"type": 3,
"epsg_code": 32650 // UTM Zone 50N
},
"points": [
{
"id": "GCP001",
"coordinate": [500123.456, 2500123.456, 123.456],
"usage": 0,
"observations": [
{
"id": 1,
"uv": [2736.5, 1824.3]
},
{
"id": 5,
"uv": [1892.7, 2104.8]
}
]
},
{
"id": "GCP002",
"coordinate": [500223.456, 2500223.456, 125.678],
"usage": 0,
"observations": [
{
"id": 3,
"uv": [3104.2, 1567.9]
},
{
"id": 7,
"uv": [2345.6, 1890.2]
}
]
},
{
"id": "CHECK001",
"coordinate": [500323.456, 2500323.456, 127.890],
"usage": 1, // 检查点
"observations": [
{
"id": 2,
"uv": [1567.8, 2345.6]
}
]
}
]
}
}
高精度测绘项目配置
{
"license_id": 9200,
"working_dir": "C:/Projects/HighPrecision_AT",
"gdal_folder": "C:/MipMap/SDK/data",
"coordinate_system": {
"type": 2,
"epsg_code": 4326
},
"camera_meta_data": [...],
"image_meta_data": [
{
"id": 1,
"path": "IMG_0001.JPG",
"meta_data": {
"pos": [114.123, 22.123, 150.0],
"pos_sigma": [0.05, 0.05, 0.10], // RTK 高精度
"position_constant": false // 允许优化
}
}
],
"control_point": {
"coordinate_system": {
"type": 3,
"epsg_code": 4978 // ECEF for high precision
},
"points": [
// 多个均匀分布的控制点
{
"id": "GCP_NW",
"coordinate": [...],
"usage": 0,
"observations": [...]
},
{
"id": "GCP_NE",
"coordinate": [...],
"usage": 0,
"observations": [...]
},
{
"id": "GCP_SW",
"coordinate": [...],
"usage": 0,
"observations": [...]
},
{
"id": "GCP_SE",
"coordinate": [...],
"usage": 0,
"observations": [...]
},
{
"id": "GCP_CENTER",
"coordinate": [...],
"usage": 0,
"observations": [...]
}
]
}
}
控制点布设原则
1. 数量要求
- 最少:3 个控制点(解算需要)
- 建议:5-8 个控制点 + 2-3 个检查点
- 大区域:每 50-100 张图像至少 1 个控制点
2. 分布要求
理想的控制点分布:
+-----+-----+-----+
| GCP | GCP | GCP |
+-----+-----+-----+
| GCP | CHK | GCP | GCP: 控制点
+-----+-----+-----+ CHK: 检查点
| GCP | GCP | GCP |
+-----+-----+-----+
3. 高程分布
- 在不同高程层次布设控制点
- 避免所有控制点在同一平面
- 山区项目尤其注意高程变化
刺点精度要求
像素精度
- 理想:< 1 像素
- 可接受:< 2 像素
- 需改进:> 3 像素
多视角观测
- 每个控制点至少在 2 张图像中可见
- 理想情况下 3-5 张图像
- 观测角度差异 > 15°
坐标系统注意事项
1. 坐标系一致性
{
// 图像位置通常为 WGS84
"coordinate_system": {
"type": 2,
"epsg_code": 4326
},
// 控制点通常为当地投影坐标系
"control_point": {
"coordinate_system": {
"type": 3,
"epsg_code": 32650 // 根据项目位置选择
}
}
}
2. 常用坐标系
地区 | EPSG | 说明 |
---|---|---|
中国 | 4490 | CGCS2000 地理坐标 |
中国 | 4547-4554 | CGCS2000 高斯投影 |
全球 | 32601-32660 | UTM 北半球 |
全球 | 32701-32760 | UTM 南半球 |
质量评估
1. 优化报告解读
优化完成后,检查日志中的精度报告:
[INFO] Control Point Residuals:
GCP001: 0.023m (X), 0.015m (Y), 0.041m (Z)
GCP002: 0.019m (X), 0.022m (Y), 0.038m (Z)
[INFO] Check Point Errors:
CHECK001: 0.045m (X), 0.052m (Y), 0.068m (Z)
[INFO] RMS Error: 0.048m
2. 精度标准
项目类型 | 平面精度 | 高程精度 |
---|---|---|
地形测绘 | < 0.05m | < 0.10m |
工程测量 | < 0.10m | < 0.15m |
一般应用 | < 0.30m | < 0.50m |
最佳实践
1. 控制点采集
- 使用 RTK/全站仪等高精度设备
- 选择稳定、易识别的地物
- 记录详细的点位描述和照片
2. 刺点流程
- 在空三结果查看器中加载影像
- 找到控制点对应的地物
- 精确标记像素位置
- 检查多视角一致性
3. 迭代优化
# 第一次优化
reconstruct_full_engine.exe -reconstruct_type 3 -task_json optimize_v1.json
# 检查结果,调整异常点
# 第二次优化
reconstruct_full_engine.exe -reconstruct_type 3 -task_json optimize_v2.json
4. 常见问题处理
残差过大
- 检查刺点精度
- 验证控制点坐标
- 考虑将该点设为检查点
系统性偏差
- 检查坐标系设置
- 验证控制点坐标系
- 考虑相机标定问题
输出结果
优化后的空三结果保存在相同位置:
milestones/mvs_optimized.xml
- 优化后的内部格式products/AT/block_exchange_optimized.xml
- 优化后的交换格式log/optimization_report.txt
- 优化报告
示例:完整工作流程
import subprocess
import json
# 1. 执行初始空三
at_config = {
"license_id": 9200,
"working_dir": "C:/Project",
# ... 其他参数
}
with open("at_config.json", "w") as f:
json.dump(at_config, f)
subprocess.run(["reconstruct_full_engine.exe", "-reconstruct_type", "1", "-task_json", "at_config.json"])
# 2. 进行控制点刺点(通常在外部软件完成)
# 3. 准备优化配置
optimize_config = at_config.copy()
optimize_config["control_point"] = {
"coordinate_system": {"type": 3, "epsg_code": 32650},
"points": [
# 控制点数据
]
}
with open("optimize_config.json", "w") as f:
json.dump(optimize_config, f)
# 4. 执行优化
subprocess.run(["reconstruct_full_engine.exe", "-reconstruct_type", "3", "-task_json", "optimize_config.json"])
# 5. 使用优化结果进行三维重建
# ...
下一步
- 使用优化后的空三结果进行 Reconstruct3D
- 了解大规模数据分块处理
- 查看基本概念了解控制点使用
提示:控制点是确保测绘精度的关键。合理的控制点布设和精确的刺点是获得高精度成果的基础。