API ReconstructFull
ReconstructFull é a interface de reconstrução completa mais simples e fácil de usar, adequada para início rápido de projetos e novos usuários. Ela gerencia automaticamente o fluxo completo de extração de metadados de imagem, cálculo de triangulação aérea e reconstrução 3D.
🎯 Características da Interface
- ✅ Alto grau de automação: Lê automaticamente informações de GPS e câmera do EXIF das imagens
- ✅ Configuração simples: O mínimo necessário é apenas fornecer o caminho das imagens
- ✅ Tudo em um: Gera resultados finais diretamente das imagens
- ✅ Otimização inteligente: Seleciona automaticamente os melhores parâmetros de processamento
📋 Detalhes dos Parâmetros
Parâmetros Obrigatórios
Nome do Parâmetro | Tipo | Descrição | Valor de Exemplo |
---|---|---|---|
license_id | int | ID da licença SDK | 9200 |
working_dir | string | Caminho do diretório de trabalho | "C:/Projects/MyProject" |
gdal_folder | string | Diretório de dados GDAL | "C:/MipMap/SDK/data" |
coordinate_system | object | Sistema de coordenadas de entrada | Ver descrição abaixo |
image_meta_data | array | Lista de imagens | Ver descrição abaixo |
input_image_type | int | Tipo de imagem | 1 =RGB, 2 =Multiespectral, 3 =Infravermelho |
resolution_level | int | Nível de precisão | 1 =Alto, 2 =Médio, 3 =Baixo |
Parâmetros Opcionais - Controle de Saída
Nome do Parâmetro | Tipo | Valor Padrão | Descrição |
---|---|---|---|
generate_obj | bool | false | Gerar modelo formato OBJ |
generate_ply | bool | false | Gerar modelo formato PLY |
generate_osgb | bool | false | Gerar formato OSGB (fotografia oblíqua) |
generate_3d_tiles | bool | false | Gerar 3D Tiles (Cesium) |
generate_las | bool | false | Gerar nuvem de pontos LAS |
generate_pc_ply | bool | false | Gerar nuvem de pontos PLY |
generate_pc_osgb | bool | false | Gerar nuvem de pontos OSGB (LOD) |
generate_pc_pnts | bool | false | Gerar nuvem de pontos PNTS (3D Tiles) |
generate_geotiff | bool | false | Gerar ortofoto |
generate_tile_2D | bool | false | Gerar ladrilhos 2D |
generate_2D_from_3D_model | bool | false | Gerar ortofoto do modelo 3D |
Parâmetros Opcionais - Sistema de Coordenadas
Nome do Parâmetro | Tipo | Valor Padrão | Descrição |
---|---|---|---|
coordinate_system_3d | object | Local/LocalENU | Sistema de coordenadas 3D de saída |
coordinate_system_2d | object | LocalENU | Sistema de coordenadas 2D de saída |
Parâmetros Opcionais - Funções Avançadas
Nome do Parâmetro | Tipo | Valor Padrão | Descrição |
---|---|---|---|
gcp_path | string | - | Caminho do arquivo de pontos de controle |
gcp_coor_sys | object | - | Sistema de coordenadas dos pontos de controle |
use_image_position_constraint | bool | true | Usar restrição de posição da imagem |
fast_mode | bool | false | Modo rápido (qualidade menor) |
min_avali_memory_size | float | 16.0 | Tamanho mínimo de memória disponível (GB) |
output_block_change_xml | bool | false | Saída Block Exchange XML |
📝 Detalhes das Estruturas de Dados
Objeto coordinate_system
{
"type": 2, // 1=Projeção, 2=Geográfico, 3=Geocêntrico
"type_name": "Geographic",
"label": "WGS 84", // Nome do sistema de coordenadas
"epsg_code": 4326 // Código EPSG
}
Elementos do array image_meta_data
Formato básico (leitura automática de EXIF)
{
"id": 1, // Identificador único
"path": "C:/Images/DJI_0001.JPG", // Caminho da imagem
"group": "camera_1" // Opcional: agrupamento de câmera
}
Formato completo (metadados personalizados)
{
"id": 1,
"path": "C:/Images/IMG_0001.JPG",
"group": "nadir", // Nome do grupo da câmera
"meta_data": { // Metadados personalizados
"width": 6000, // Largura da imagem (pixels)
"height": 4000, // Altura da imagem (pixels)
"pos": [114.123456, 22.123456, 100.5], // [Longitude, Latitude, Elevação]
"pos_sigma": [0.05, 0.05, 0.10], // [Precisão X, Precisão Y, Precisão Z] (metros)
"focal_length": 24.0, // Distância focal (milímetros)
"pixel_size": 0.00391 // Tamanho do pixel (milímetros)
}
}
Parâmetro agrupamento de câmera (group)
Usado para sistemas multi-câmera, para processar imagens de diferentes câmeras em 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"}
]
Cenários comuns de agrupamento:
- Câmera oblíqua de cinco lentes: nadir, oblique_forward, oblique_backward, oblique_left, oblique_right
- Sistema de câmera dupla: wide_angle, telephoto
- Cooperação multi-drone: drone_1, drone_2, drone_3
- Multi-temporal: morning, afternoon
Explicação dos parâmetros pos e pos_sigma
Parâmetro pos:
- Formato:
[Longitude, Latitude, Elevação]
ou[X, Y, Z]
(depende do sistema de coordenadas) - Unidade: Graus e metros para sistema geográfico, metros para sistema de projeção
- Propósito: Sobrescrever informações GPS no EXIF ou fornecer posição para imagens sem GPS
Parâmetro pos_sigma:
- Formato:
[σ_X, σ_Y, σ_Z]
- Unidade: Metros
- Significado: Desvio padrão da medição de posição em cada direção (1σ)
- Propósito: Usado como peso na otimização de triangulação aérea, maior precisão (σ menor) significa maior peso
Valores típicos:
Método de Posicionamento | σ_X/σ_Y | σ_Z | Descrição |
---|---|---|---|
Solução fixa RTK | 0.02-0.05m | 0.05-0.10m | Máxima precisão |
Pós-processamento PPK | 0.03-0.08m | 0.08-0.15m | Alta precisão |
GPS normal | 2-5m | 3-8m | Precisão padrão |
Estimativa manual | 0.5-2m | 1-3m | Baixa precisão |
📝 Exemplos de Configuração
Configuração 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
}
Exemplo de Configuração de Grupos Multi-Câmera
{
"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
},
// Agrupamento de imagens multi-câmera
"image_meta_data": [
// Câmera nadir
{"id": 1, "path": "nadir/IMG_001.jpg", "group": "nadir"},
{"id": 2, "path": "nadir/IMG_002.jpg", "group": "nadir"},
// Câmera oblíqua frontal
{"id": 3, "path": "forward/IMG_001.jpg", "group": "oblique_f"},
{"id": 4, "path": "forward/IMG_002.jpg", "group": "oblique_f"},
// Mais grupos de câmeras...
],
"generate_osgb": true,
"generate_3d_tiles": true
}
Exemplo de Configuração 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 dados de posição de alta precisão pós-processados PPK
"image_meta_data": [
{
"id": 1,
"path": "images/DJI_0001.JPG",
"meta_data": {
"width": 5472,
"height": 3648,
"pos": [114.305421, 22.596013, 120.543], // Posição precisa após processamento PPK
"pos_sigma": [0.03, 0.03, 0.05] // Precisão 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]
}
}
// ... mais imagens
],
"generate_obj": true,
"generate_geotiff": true
}
Exemplo de Configuração Completa (com 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 saída - UTM
"coordinate_system_3d": {
"type": 3,
"label": "WGS 84 / UTM zone 50N",
"epsg_code": 32650
},
// Pontos de controle
"gcp_path": "D:/Projects/HighPrecision/gcps.txt",
"gcp_coor_sys": {
"type": 3,
"label": "WGS 84 / UTM zone 50N",
"epsg_code": 32650
},
// Lista de imagens
"image_meta_data": [
{"id": 1, "path": "D:/Data/flight1/IMG_001.JPG"},
{"id": 2, "path": "D:/Data/flight1/IMG_002.JPG"},
// ... mais imagens
],
// Gerar todos os formatos
"generate_obj": true,
"generate_osgb": true,
"generate_3d_tiles": true,
"generate_las": true,
"generate_geotiff": true,
"generate_tile_2D": true
}
💾 Estrutura de Saída
Após a conclusão do processamento, a seguinte estrutura será gerada no diretório de trabalho:
working_dir/
├── products/ # Resultados finais
│ ├── models/ # Modelos 3D
│ │ ├── model.obj # Formato OBJ
│ │ ├── model.mtl # Arquivo de material
│ │ ├── textures/ # Imagens de textura
│ │ └── tileset.json # 3D Tiles
│ ├── pointcloud/ # Dados de nuvem de pontos
│ │ └── cloud.las # Nuvem de pontos formato LAS
│ └── orthophoto/ # Ortofoto
│ ├── ortho.tif # GeoTIFF
│ └── tiles/ # Dados de ladrilhos
├── milestones/ # Resultados intermediários
│ ├── at_result/ # Resultado da triangulação aérea
│ ├── roi.json # Intervalo ROI
│ └── report.html # Relatório de processamento
└── log/ # Arquivos de log
└── log.txt # Log detalhado
🎯 Sugestões de Uso
Cenários Apropriados
- ✅ Prototipagem rápida e testes
- ✅ Projetos padrão de fotografia aérea
- ✅ Processamento automatizado em lote
- ✅ Aprendizado para iniciantes
Cenários Inapropriados
- ❌ Necessidade de controle fino dos parâmetros de processamento
- ❌ Necessidade de usar pontos de controle
- ❌ Necessidade de verificar resultados intermediários
- ❌ Câmeras especiais ou sensores
🔧 Técnicas Avançadas
1. Processamento em lote de múltiplos projetos
import json
import subprocess
from pathlib import Path
def batch_process(project_list):
for project in project_list:
# Criar configuração
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
}
# Salvar configuração
config_path = f"./config_{project['name']}.json"
with open(config_path, 'w') as f:
json.dump(config, f, indent=2)
# Executar processamento
subprocess.run([
"reconstruct_full_engine.exe",
"-reconstruct_type", "0",
"-task_json", config_path
])
2. Otimização automática de parâmetros
def optimize_parameters(image_count, available_memory_gb):
"""Selecionar parâmetros automaticamente com base no tamanho do projeto"""
# Nível de resolução
if image_count < 100:
resolution_level = 1 # Alta precisão
elif image_count < 500:
resolution_level = 2 # Precisão média
else:
resolution_level = 3 # Baixa precisão (projetos grandes)
# Formatos de saída
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. Monitoramento de progresso
import re
import time
from threading import Thread
def monitor_progress(log_file):
"""Monitorar progresso do processamento"""
def read_progress():
with open(log_file, 'r') as f:
f.seek(0, 2) # Ir para o final do arquivo
while True:
line = f.readline()
if line:
match = re.search(r'\[PROGRESS\] (\d+)%', line)
if match:
progress = int(match.group(1))
print(f"\rProgresso: {'█' * (progress//2)}{'░' * (50-progress//2)} {progress}%", end='')
time.sleep(0.1)
thread = Thread(target=read_progress, daemon=True)
thread.start()
❓ Perguntas Frequentes
P: Por que algumas imagens não foram usadas?
R: ReconstructFull filtrará automaticamente imagens de baixa qualidade:
- Imagens desfocadas
- Imagens sem informações GPS
- Imagens duplicadas ou com alta similaridade
Você pode consultar as imagens filtradas e suas razões no log.
P: Como processar imagens sem GPS?
R: Para imagens sem informações GPS, você precisa:
- Usar a interface ReconstructAT (suporta processamento sem GPS)
- Ou adicionar informações GPS manualmente ao EXIF
- Ou usar arquivo POS externo
P: Memória insuficiente ao processar projeto grande?
R: Soluções:
- Reduzir
resolution_level
para 2 ou 3 - Reduzir formatos de saída gerados simultaneamente
- Usar processamento em blocos (requer outras interfaces)
🔗 Links Relacionados
- Detalhes dos sistemas de coordenadas
- Descrição dos metadados de imagem
- Comparação dos formatos de saída
- Interface ReconstructAT (mais controle)
ReconstructFull é a melhor escolha para começar a usar o MipMapEngine SDK. Com o crescimento da experiência, você pode explorar outras interfaces para obter mais controle.