API ReconstructFull
ReconstructFull es la interfaz de reconstrucción completa más simple y fácil de usar, adecuada para el inicio rápido de proyectos y usuarios novatos. Maneja automáticamente el flujo completo de extracción de metadatos de imágenes, cálculo de triangulación aérea y reconstrucción 3D.
🎯 Características de la Interfaz
- ✅ Alto grado de automatización: Lee automáticamente GPS e información de cámara desde EXIF de imágenes
- ✅ Configuración simple: Lo mínimo requerido es solo proporcionar la ruta de imágenes
- ✅ Todo en uno: Genera resultados finales directamente desde imágenes
- ✅ Optimización inteligente: Selecciona automáticamente los mejores parámetros de procesamiento
📋 Detalles de Parámetros
Parámetros Requeridos
| Nombre del Parámetro | Tipo | Descripción | Valor de Ejemplo |
|---|---|---|---|
license_id | int | ID de licencia SDK | 9200 |
working_dir | string | Ruta del directorio de trabajo | "C:/Projects/MyProject" |
gdal_folder | string | Directorio de datos GDAL | "C:/MipMap/SDK/data" |
coordinate_system | object | Sistema de coordenadas de entrada | Ver descripción abajo |
image_meta_data | array | Lista de imágenes | Ver descripción abajo |
input_image_type | int | Tipo de imagen | 1=RGB, 2=Multiespectral, 3=Infrarrojo |
resolution_level | int | Nivel de precisión | 1=Alto, 2=Medio, 3=Bajo |
Parámetros Opcionales - Control de Salida
| Nombre del Parámetro | Tipo | Valor Predeterminado | Descripción |
|---|---|---|---|
generate_obj | bool | false | Generar modelo formato OBJ |
generate_ply | bool | false | Generar modelo formato PLY |
generate_osgb | bool | false | Generar formato OSGB (fotografía oblicua) |
generate_3d_tiles | bool | false | Generar 3D Tiles (Cesium) |
generate_las | bool | false | Generar nube de puntos LAS |
generate_pc_ply | bool | false | Generar nube de puntos PLY |
generate_pc_osgb | bool | false | Generar nube de puntos OSGB (LOD) |
generate_pc_pnts | bool | false | Generar nube de puntos PNTS (3D Tiles) |
generate_geotiff | bool | false | Generar ortofoto |
generate_tile_2D | bool | false | Generar teselas 2D |
generate_2D_from_3D_model | bool | false | Generar ortofoto desde modelo 3D |
Parámetros Opcionales - Sistema de Coordenadas
| Nombre del Parámetro | Tipo | Valor Predeterminado | Descripción |
|---|---|---|---|
coordinate_system_3d | object | Local/LocalENU | Sistema de coordenadas 3D de salida |
coordinate_system_2d | object | LocalENU | Sistema de coordenadas 2D de salida |
Parámetros Opcionales - Funciones Avanzadas
| Nombre del Parámetro | Tipo | Valor Predeterminado | Descripción |
|---|---|---|---|
gcp_path | string | - | Ruta del archivo de puntos de control |
gcp_coor_sys | object | - | Sistema de coordenadas de puntos de control |
use_image_position_constraint | bool | true | Usar restricción de posición de imagen |
fast_mode | bool | false | Modo rápido (menor calidad) |
min_avali_memory_size | float | 16.0 | Tamaño mínimo de memoria disponible (GB) |
output_block_change_xml | bool | false | Generar Block Exchange XML |
📝 Detalles de Estructuras de Datos
Objeto coordinate_system
{
"type": 2, // 1=Proyección, 2=Geográfico, 3=Geocéntrico
"type_name": "Geographic",
"label": "WGS 84", // Nombre del sistema de coordenadas
"epsg_code": 4326 // Código EPSG
}
Elementos del array image_meta_data
Formato básico (lectura automática de EXIF)
{
"id": 1, // Identificador único
"path": "C:/Images/DJI_0001.JPG", // Ruta de imagen
"group": "camera_1" // Opcional: agrupación de cámara
}
Formato completo (metadatos personalizados)
{
"id": 1,
"path": "C:/Images/IMG_0001.JPG",
"group": "nadir", // Nombre del grupo de cámara
"meta_data": { // Metadatos personalizados
"width": 6000, // Ancho de imagen (píxeles)
"height": 4000, // Alto de imagen (píxeles)
"pos": [114.123456, 22.123456, 100.5], // [Longitud, Latitud, Elevación]
"pos_sigma": [0.05, 0.05, 0.10], // [Precisión X, Precisión Y, Precisión Z] (metros)
"focal_length": 24.0, // Distancia focal (milímetros)
"pixel_size": 0.00391 // Tamaño de píxel (milímetros)
}
}
Parámetro de agrupación de cámara (group)
Usado para sistemas de múltiples cámaras, para procesar imágenes de diferentes cámaras en grupos:
"image_meta_data": [
{"id": 1, "path": "nadir/IMG_001.jpg", "group": "nadir"},
{"id": 2, "path": "nadir/IMG_002.jpg", "group": "nadir"},
{"id": 3, "path": "oblique_f/IMG_001.jpg", "group": "oblique_forward"},
{"id": 4, "path": "oblique_b/IMG_001.jpg", "group": "oblique_backward"},
{"id": 5, "path": "oblique_l/IMG_001.jpg", "group": "oblique_left"},
{"id": 6, "path": "oblique_r/IMG_001.jpg", "group": "oblique_right"}
]
Escenarios de agrupación comunes:
- Cámara oblicua de cinco lentes: nadir, oblique_forward, oblique_backward, oblique_left, oblique_right
- Sistema de cámara dual: wide_angle, telephoto
- Cooperación multi-drone: drone_1, drone_2, drone_3
- Multi-temporal: morning, afternoon
Explicación de parámetros pos y pos_sigma
Parámetro pos:
- Formato:
[Longitud, Latitud, Elevación]o[X, Y, Z](dependiendo del sistema de coordenadas) - Unidad: Grados y metros para sistema geográfico, metros para sistema de proyección
- Propósito: Sobrescribir información GPS en EXIF o proporcionar posición para imágenes sin GPS
Parámetro pos_sigma:
- Formato:
[σ_X, σ_Y, σ_Z] - Unidad: Metros
- Significado: Desviación estándar de medición de posición en cada dirección (1σ)
- Propósito: Usado como peso en optimización de triangulación aérea, mayor precisión (σ menor) significa mayor peso
Valores típicos:
| Método de Posicionamiento | σ_X/σ_Y | σ_Z | Descripción |
|---|---|---|---|
| Solución fija RTK | 0.02-0.05m | 0.05-0.10m | Máxima precisión |
| Post-procesamiento PPK | 0.03-0.08m | 0.08-0.15m | Alta precisión |
| GPS normal | 2-5m | 3-8m | Precisión estándar |
| Estimación manual | 0.5-2m | 1-3m | Baja precisión |
📝 Ejemplos de Configuración
Configuración Mínima
{
"license_id": 9200,
"working_dir": "C:/Projects/QuickStart",
"gdal_folder": "C:/MipMap/SDK/data",
"input_image_type": 1,
"resolution_level": 2,
"coordinate_system": {
"type": 2,
"label": "WGS 84",
"epsg_code": 4326
},
"image_meta_data": [
{"id": 1, "path": "C:/Images/DJI_0001.JPG"},
{"id": 2, "path": "C:/Images/DJI_0002.JPG"},
{"id": 3, "path": "C:/Images/DJI_0003.JPG"},
{"id": 4, "path": "C:/Images/DJI_0004.JPG"},
{"id": 5, "path": "C:/Images/DJI_0005.JPG"}
],
"generate_obj": true,
"generate_geotiff": true
}
Ejemplo de Configuración de Grupos Multi-Cámara
{
"license_id": 9200,
"working_dir": "D:/Projects/MultiCamera",
"gdal_folder": "D:/MipMap/SDK/data",
"input_image_type": 1,
"resolution_level": 1,
"coordinate_system": {
"type": 2,
"label": "WGS 84",
"epsg_code": 4326
},
// Agrupación de imágenes multi-cámara
"image_meta_data": [
// Cámara nadir
{"id": 1, "path": "nadir/IMG_001.jpg", "group": "nadir"},
{"id": 2, "path": "nadir/IMG_002.jpg", "group": "nadir"},
// Cámara oblicua frontal
{"id": 3, "path": "forward/IMG_001.jpg", "group": "oblique_f"},
{"id": 4, "path": "forward/IMG_002.jpg", "group": "oblique_f"},
// Más grupos de cámaras...
],
"generate_osgb": true,
"generate_3d_tiles": true
}
Ejemplo de Configuración POS Personalizada
{
"license_id": 9200,
"working_dir": "D:/Projects/PPK_Project",
"gdal_folder": "D:/MipMap/SDK/data",
"input_image_type": 1,
"resolution_level": 1,
"coordinate_system": {
"type": 2,
"label": "WGS 84",
"epsg_code": 4326
},
// Usar datos de posición de alta precisión post-procesados PPK
"image_meta_data": [
{
"id": 1,
"path": "images/DJI_0001.JPG",
"meta_data": {
"width": 5472,
"height": 3648,
"pos": [114.305421, 22.596013, 120.543], // Posición precisa después del procesamiento PPK
"pos_sigma": [0.03, 0.03, 0.05] // Precisión PPK
}
},
{
"id": 2,
"path": "images/DJI_0002.JPG",
"meta_data": {
"width": 5472,
"height": 3648,
"pos": [114.305512, 22.596089, 120.621],
"pos_sigma": [0.03, 0.03, 0.05]
}
}
// ... más imágenes
],
"generate_obj": true,
"generate_geotiff": true
}
Ejemplo de Configuración Completa (con GCP)
{
"license_id": 9200,
"working_dir": "D:/Projects/HighPrecision",
"gdal_folder": "D:/MipMap/SDK/data",
"input_image_type": 1,
"resolution_level": 1,
// Sistema de coordenadas de entrada - WGS84
"coordinate_system": {
"type": 2,
"label": "WGS 84",
"epsg_code": 4326
},
// Sistema de coordenadas de salida - UTM
"coordinate_system_3d": {
"type": 3,
"label": "WGS 84 / UTM zone 50N",
"epsg_code": 32650
},
// Puntos de control
"gcp_path": "D:/Projects/HighPrecision/gcps.txt",
"gcp_coor_sys": {
"type": 3,
"label": "WGS 84 / UTM zone 50N",
"epsg_code": 32650
},
// Lista de imágenes
"image_meta_data": [
{"id": 1, "path": "D:/Data/flight1/IMG_001.JPG"},
{"id": 2, "path": "D:/Data/flight1/IMG_002.JPG"},
// ... más imágenes
],
// Generar todos los formatos
"generate_obj": true,
"generate_osgb": true,
"generate_3d_tiles": true,
"generate_las": true,
"generate_geotiff": true,
"generate_tile_2D": true
}
💾 Estructura de Salida
Después de completar el procesamiento, se generará la siguiente estructura en el directorio de trabajo:
working_dir/
├── products/ # Resultados finales
│ ├── models/ # Modelos 3D
│ │ ├── model.obj # Formato OBJ
│ │ ├── model.mtl # Archivo de material
│ │ ├── textures/ # Imágenes de textura
│ │ └── tileset.json # 3D Tiles
│ ├── pointcloud/ # Datos de nube de puntos
│ │ └── cloud.las # Nube de puntos formato LAS
│ └── orthophoto/ # Ortofoto
│ ├── ortho.tif # GeoTIFF
│ └── tiles/ # Datos de teselas
├── milestones/ # Resultados intermedios
│ ├── at_result/ # Resultado de triangulación aérea
│ ├── roi.json # Rango ROI
│ └── report.html # Reporte de procesamiento
└── log/ # Archivos de registro
└── log.txt # Registro detallado
🎯 Sugerencias de Uso
Escenarios Apropiados
- ✅ Prototipado rápido y pruebas
- ✅ Proyectos estándar de fotografía aérea
- ✅ Procesamiento automatizado por lotes
- ✅ Aprendizaje para principiantes
Escenarios Inapropiados
- ❌ Necesidad de control fino de parámetros de procesamiento
- ❌ Necesidad de usar puntos de control
- ❌ Necesidad de verificar resultados intermedios
- ❌ Cámaras especiales o sensores
🔧 Técnicas Avanzadas
1. Procesamiento por lotes de múltiples proyectos
import json
import subprocess
from pathlib import Path
def batch_process(project_list):
for project in project_list:
# Crear configuración
config = {
"license_id": 9200,
"working_dir": f"./output/{project['name']}",
"gdal_folder": "./data",
"coordinate_system": {"type": 2, "epsg_code": 4326},
"image_meta_data": [
{"id": i+1, "path": str(img)}
for i, img in enumerate(project['images'])
],
"input_image_type": 1,
"resolution_level": 2,
"generate_obj": True,
"generate_geotiff": True
}
# Guardar configuración
config_path = f"./config_{project['name']}.json"
with open(config_path, 'w') as f:
json.dump(config, f, indent=2)
# Ejecutar procesamiento
subprocess.run([
"reconstruct_full_engine.exe",
"-reconstruct_type", "0",
"-task_json", config_path
])
2. Optimización automática de parámetros
def optimize_parameters(image_count, available_memory_gb):
"""Seleccionar parámetros automáticamente según el tamaño del proyecto"""
# Nivel de resolución
if image_count < 100:
resolution_level = 1 # Alta precisión
elif image_count < 500:
resolution_level = 2 # Precisión media
else:
resolution_level = 3 # Baja precisión (proyectos grandes)
# Formatos de salida
if available_memory_gb > 32:
formats = {
"generate_obj": True,
"generate_osgb": True,
"generate_3d_tiles": True,
"generate_las": True
}
else:
formats = {
"generate_obj": True,
"generate_las": False
}
return resolution_level, formats
3. Monitoreo de progreso
import re
import time
from threading import Thread
def monitor_progress(log_file):
"""Monitorear progreso del procesamiento"""
def read_progress():
with open(log_file, 'r') as f:
f.seek(0, 2) # Ir al final del archivo
while True:
line = f.readline()
if line:
match = re.search(r'\[PROGRESS\] (\d+)%', line)
if match:
progress = int(match.group(1))
print(f"\rProgreso: {'█' * (progress//2)}{'░' * (50-progress//2)} {progress}%", end='')
time.sleep(0.1)
thread = Thread(target=read_progress, daemon=True)
thread.start()
❓ Preguntas Frecuentes
P: ¿Por qué algunas imágenes no fueron utilizadas?
R: ReconstructFull filtrará automáticamente imágenes de mala calidad:
- Imágenes borrosas
- Imágenes sin información GPS
- Imágenes duplicadas o con alta similitud
Puede revisar las imágenes filtradas y sus razones en el registro.
P: ¿Cómo procesar imágenes sin GPS?
R: Para imágenes sin información GPS, necesita:
- Usar la interfaz ReconstructAT (soporta procesamiento sin GPS)
- O agregar información GPS manualmente a EXIF
- O usar archivo POS externo
P: ¿Memoria insuficiente al procesar proyecto grande?
R: Soluciones:
- Reducir
resolution_levela 2 o 3 - Reducir formatos de salida generados simultáneamente
- Usar procesamiento en bloques (requiere usar otras interfaces)
🔗 Enlaces Relacionados
- Detalles de sistemas de coordenadas
- Descripción de metadatos de imagen
- Comparación de formatos de salida
- Interfaz ReconstructAT (más control)
ReconstructFull es la mejor opción para comenzar a usar MipMapEngine SDK. A medida que crezca la experiencia, puede explorar otras interfaces para obtener más control.