ReconstructAT - 空中三角测量
概述
ReconstructAT 接口用于执行空中三角测量(Aerotriangulation),是专业用户进行精细控制的首选接口。该接口提供了详细的参数设置,支持相机分组、POS 导入、控制点导入等高级功能。
适用场景
- 需要精细控制空三参数
- 需要检查和优化空三结果
- 多相机系统重建
- 需要集成控制点
- 需要激光雷达重建
接口调用
命令行调用
reconstruct_full_engine.exe -reconstruct_type 1 -task_json at_config.json
参数说明
reconstruct_type: 固定为1(表示 ReconstructAT)task_json: 参数文件路径
参数详解
必需参数
| 参数名 | 类型 | 说明 |
|---|---|---|
working_dir | string | 工作目录,保存中间文件和最终结果 |
gdal_folder | string | GDAL 数据路径(SDK 外部数据文件夹) |
coordinate_system | JSON | 输入图像位置的坐标系统 |
camera_meta_data | JSON Array | 相机元数据信息,格式查看camera_meta_data |
image_meta_data | JSON Array | 输入图像的元数据信息,格式查看image_meta_data |
可选参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
input_image_type | int | 1 | 图像类型:1=RGB,2=多光谱,3=红外 |
fast_mode | bool | false | 快速模式,适用于有 GPS 的数据 |
数据结构说明
coordinate_system 对象
| 字段名 | 类型 | 说明 | 示例值 |
|---|---|---|---|
type | int | 坐标系类型:0=LocalENU,1=Local,2=Geographic,3=Projected,4=ECEF | 2 |
type_name | string | 坐标系类型名称(可选,辅助说明) | "Geographic" |
label | string | 坐标系名称(可选) | "WGS 84" |
epsg_code | int | EPSG 代码(地理/投影/地心坐标系需填写) | 4326 |
wkt | string | WKT 字符串(可选,替代 epsg_code) | "..." |
origin_point | array[3] | 原点WGS84坐标 [经度, 纬度, 高程](仅 type=0 LocalENU 时需要) | [114.12, 22.12, 0] |
offset | array[3] | 坐标系原点偏移(可选) | [0, 0, 0] |
相机元数据(Camera Metadata)
| 字段名 | 类型 | 是否必需 | 说明 |
|---|---|---|---|
id | int | 是 | 相机唯一ID |
meta_data | object | 是 | 相机元信息,详见下表 |
| meta_data 子字段说明: |
| 字段名 | 类型 | 是否必需 | 说明 |
|---|---|---|---|
projection_model | int | 是 | 镜头模型: 0-普通镜头(k1,k2,k3,p1,p2); 1-鱼眼镜头(k1,k2,k3,k4) |
camera_name | string | 是 | 相机名称 |
width | int | 是 | 传感器宽度(像素) |
height | int | 是 | 传感器高度(像素) |
parameters | array | 否 | 相机内参数组(框幅式相机顺序为 fx, fy, cx, cy, k1, k2, k3, p1, p2;鱼眼相机顺序为 fx fy cx cy k1 k2 k3 k4) |
普通镜头
"camera_meta_data": [
{
"id": 1,
"meta_data": {
"projection_model": 0,
"camera_name": "common",
"width": 5280,
"height": 3956,
"parameters": [
3713.29,
3713.29,
2647.02,
1969.28,
-0.11257524,
0.01487443,
-0.00008572,
1e-7,
-0.02706411,
0
]
}
}
]
鱼眼镜头
"camera_meta_data": [
{
"id": 1,
"meta_data": {
"camera_name": "fisheye",
"projection_model": 1,
"width": 3600,
"height": 3600,
"parameters": [
982.7593599212141,
982.7593599212141,
1747.6373897301492,
1806.4116030074354,
0.03702410479839055,
-0.016007338300982825,
-1.0884582901480562e-05,
-9.773097281093723e-05
]
}
}
]
图像元数据(Image Metadata)
| 字段名 | 类型 | 是否必需 | 说明 |
|---|---|---|---|
id | int | 是 | 图像唯一ID |
path | string | 是 | 图像绝对路径 |
meta_data | object | 是 | 图像元信息,详见下表 |
【重要】调用ReconstructAT必须指定meta_data字段
meta_data 子字段说明:
| 字段名 | 类型 | 是否必需 | 说明 |
|---|---|---|---|
width | int | 是 | 图像宽度(像素) |
height | int | 是 | 图像高度(像素) |
camera_id | int | 是 | 对应相机ID |
focal_length_in_35mm | double | 是 | 35mm等效焦距(毫米) |
pos | array[3] | 否 | POS位置 [经度/X, 纬度/Y, 高程/Z],需要真实hi尺度重建必须指定 |
pos_sigma | array[3] | 否 | POS位置精度(米),RTK定位:[0.03,0.03,0.06], 普通GPS定位: [2.0,2.0,5.0] |
orientation | array[9] | 否 | 旋转矩阵(9个值,行优先,单位向量,世界坐标系到相机坐标系的旋转矩阵,笛卡尔坐标系) |
position_constant | bool | 否 | 是否固定位置(true/false),固定位置意味着空三不会优化改变图像的位置,保持输入值 |
relative_altitude | double | 否 | 相对飞行高度(米) |
pre_calib_param | array | 否 | 预标定参数(如有,填写相机内参) |
dewarp_flag | bool | 否 | 畸变校正标志(如来自DJI XMP数据,true表示已去畸变) |
mask_path | string | 否 | 语义分割图,格式tif或png,标签含义见下方 |
语义标签含义
| 标签值 | 标签含义 |
|---|---|
0 | 背景 |
1 | 水体 |
2 | 建筑 |
3 | 植被 |
4 | 路面 |
5 | 车辆 |
6 | 裸地 |
7 | 硬地 |
33 | 移动物体 |
34 | 天空 |
35 | 电力线 |
255 | 无效区域 |
语义图典型使用案例:
- (1)将标记了无效区域的Mask图路径传入,SDK将在特征提取、稠密点云计算、纹理贴图时忽略无效区域,提升效率,获取更干净的点云/网格数据
- (2)将标记了水体区域的Mask图路径传入,SDK将对水域区域进行自动修补。
{
"id": 1, // 图像唯一 ID
"path": "path/to/image.jpg", // 图像绝对路径
"group": "camera_1", // 相机组 ID(可选)
"meta_data": { // 图像信息(必需)
"width": 6000, // 图像宽度(像素)
"height": 4000, // 图像高度(像素)
"camera_id": 1, // 对应相机 ID(可选,如果提供了 'pre_calib_param' 参数,将被相机元数据覆盖)
"pos": [lon, lat, alt], // 位置 [经度, 纬度, 高程]
"pos_sigma": [1.0, 1.0, 2.0], // 位置精度(米)
"orientation": [...], // 旋转矩阵(9个值,可选)
"position_constant": false, // 是否固定位置
"relative_altitude": 100.0, // 相对飞行高度(可选)
"focal_length_in_35mm": 24, // 35mm 等效焦距
"pre_calib_param": [...], // 预标定参数(可选,如果提供了 'focal_length_in_35mm' 参数,将被覆盖)
"dewarp_flag": false // 畸变校正标志(可选,来自DJI XMP数据)
}
}
坐标系统(Coordinate System)
{
"type": 2, // 0=LocalENU, 1=Local, 2=Geographic, 3=Projected, 4=ECEF
"epsg_code": 4326, // EPSG 代码(Geographic/Projected/ECEF 需要)
"wkt": "...", // WKT 字符串(可替代 epsg_code)
"origin_point": [lon, lat, alt], // LocalENU 原点(仅 type=0 需要)
"offset": [0, 0, 0] // 相对坐标系原点的偏移
}
完整配置示例
基础空三配置
{
"working_dir": "C:/Projects/AT_Task",
"gdal_folder": "C:/MipMap/SDK/data",
"coordinate_system": {
"type": 2,
"epsg_code": 4326
},
"camera_meta_data": [
{
"id": 1,
"meta_data": {
"camera_name": "DJI FC6310",
"width": 5472,
"height": 3648
}
}
],
"image_meta_data": [
{
"id": 1,
"path": "C:/Images/DJI_0001.JPG",
"meta_data": {
"width": 5472,
"height": 3648,
"camera_id": 1,
"pos": [114.123456, 22.123456, 100.5],
"pos_sigma": [2.0, 2.0, 3.0]
}
},
{
"id": 2,
"path": "C:/Images/DJI_0002.JPG",
"meta_data": {
"width": 5472,
"height": 3648,
"camera_id": 1,
"pos": [114.123556, 22.123456, 100.8],
"pos_sigma": [2.0, 2.0, 3.0]
}
}
],
"output_tie_point_las": true,
"output_block_change_xml": true
}
多相机组配置
{
"working_dir": "C:/Projects/MultiCamera_AT",
"gdal_folder": "C:/MipMap/SDK/data",
"coordinate_system": {
"type": 2,
"epsg_code": 4326
},
"camera_meta_data": [
{
"id": 1,
"meta_data": {
"camera_name": "Camera_Nadir",
"width": 6000,
"height": 4000
}
},
{
"id": 2,
"meta_data": {
"camera_name": "Camera_Oblique",
"width": 6000,
"height": 4000
}
}
],
"image_meta_data": [
{
"id": 1,
"path": "nadir/IMG_0001.JPG",
"group": "nadir",
"meta_data": {
"width": 6000,
"height": 4000,
"camera_id": 1,
"pos": [114.123456, 22.123456, 200.0],
"pos_sigma": [0.05, 0.05, 0.10]
}
},
{
"id": 2,
"path": "oblique/IMG_0001.JPG",
"group": "oblique_forward",
"meta_data": {
"width": 6000,
"height": 4000,
"camera_id": 2,
"pos": [114.123456, 22.123456, 200.0],
"pos_sigma": [0.05, 0.05, 0.10]
}
}
],
"fast_mode": true
}
高精度 RTK/PPK 配置
{
"working_dir": "C:/Projects/RTK_AT",
"gdal_folder": "C:/MipMap/SDK/data",
"coordinate_system": {
"type": 2,
"epsg_code": 4326
},
"camera_meta_data": [
{
"id": 1,
"meta_data": {
"camera_name": "DJI P1",
"width": 8192,
"height": 5460,
"parameters": [8839.5, 8839.5, 4096, 2730, 0, 0, 0, 0, 0, 0]
}
}
],
"image_meta_data": [
{
"id": 1,
"path": "C:/RTK_Images/IMG_0001.JPG",
"meta_data": {
"width": 8192,
"height": 5460,
"camera_id": 1,
"pos": [114.12345678, 22.12345678, 150.123],
"pos_sigma": [0.02, 0.02, 0.05], // 高精度 RTK
"orientation": [
// 3x3 旋转矩阵(如果有 IMU 数据)
]
}
}
],
"use_image_position_constraint": true
}
输出结果
空三完成后,会在工作目录中生成:
1. 中间结果目录 (milestones/)
mvs.xml- 内部格式的空三结果mvs_undistort.xml- 去畸变后的空三结果roi.json- 自动计算的感兴趣区域cs.json- 坐标系统信息tie_points.las- 连接点云(如果启用)
2. 导出结果 (products/AT/)
block_exchange.xml- ContextCapture 格式的空三结果(如果启用)
3. 日志文件 (log/)
log.txt- 详细处理日志
ROI 使用说明
空三完成后生成的 roi.json 包含三种类型的 ROI:
{
"rois": [
{
"type": "Smart", // 基于稀疏点智能计算
"roi": {
"boundary": [...], // 2D 边界顶点
"min_z": 100.0, // 最小高程
"max_z": 200.0 // 最大高程
}
},
{
"type": "Maximal", // 基于图像位置和稀疏点
"roi": {...}
},
{
"type": "Frustum", // 基于图像视锥
"roi": {...}
}
]
}
最佳实践
1. 图像准备
- 确保图像 EXIF 包含完整的 GPS 信息
- 图像重叠度建议 >60%
- 避免模糊或过曝的图像
2. 参数优化
- 普通 GPS:使用默认
pos_sigma[2.0, 2.0, 3.0] - RTK/PPK:设置更小的
pos_sigma如 [0.05, 0.05, 0.10] - 快速模式:有 GPS 时启用
fast_mode
3. 多相机处理
- 使用
group参数标识不同相机 - 每个相机组使用独立的
camera_id - 确保相机参数准确
4. 大数据集优化
- 启用
fast_mode加速处理 - 考虑使用
remove_small_part清理结果 - 合理设置内存使用限制
常见问题
Q: 空三失败,提示"图像匹配不足"
A: 检查:
- 图像重叠度是否足够(>60%)
- GPS 信息是否准确
- 图像质量是否良好
Q: 如何提高空三精度?
A:
- 使用高精度 POS 数据(RTK/PPK)
- 设置合适的
pos_sigma值 - 使用 OptimizeAT 加入控制点
Q: 多相机系统如何设置?
A:
- 为每个相机创建独立的
camera_meta_data - 使用
group参数区分不同相机的图像 - 确保相机内参准确
下一步
- 使用 Reconstruct3D 进行三维重建
- 使用 OptimizeAT 通过控制点优化空三结果
- 查看基本概念了解完整工作流程
提示:ReconstructAT 提供了最大的灵活性,但也需要更多的参数设置。如果您只需要快速重建,建议使用 ReconstructFull。