ReconstructFull API
ReconstructFullは最もシンプルで使いやすい全工程復元インターフェースで、プロジェクトの高速起動と新規ユーザーに適しています。画像メタデータ抽出、空中三角測量計算、3D復元の完全なワークフローを自動的に処理します。
🎯 インターフェースの特徴
- ✅ 高度な自動化: 画像EXIFからGPSとカメラ情報を自動読み取り
- ✅ シンプルな設定: 最低限必要なのは画像パスの提供のみ
- ✅ ワンストップ: 画像から直接最終成果物を生成
- ✅ インテリジェント最適化: 最適な処理パラメータを自動選択
📋 パラメータ詳細
必須パラメータ
パラメータ名 | 型 | 説明 | 例の値 |
---|---|---|---|
license_id | int | SDKライセンスID | 9200 |
working_dir | string | 作業ディレクトリパス | "C:/Projects/MyProject" |
gdal_folder | string | GDALデータディレクトリ | "C:/MipMap/SDK/data" |
coordinate_system | object | 入力座標系 | 下記説明参照 |
image_meta_data | array | 画像リスト | 下記説明参照 |
input_image_type | int | 画像タイプ | 1 =RGB, 2 =マルチスペクトル, 3 =赤外線 |
resolution_level | int | 精度レベル | 1 =高, 2 =中, 3 =低 |
オプションパラメータ - 出力制御
パラメータ名 | 型 | デフォルト値 | 説明 |
---|---|---|---|
generate_obj | bool | false | OBJ形式モデル生成 |
generate_ply | bool | false | PLY形式モデル生成 |
generate_osgb | bool | false | OSGB形式生成(斜め写真) |
generate_3d_tiles | bool | false | 3D Tiles生成(Cesium) |
generate_las | bool | false | LAS点群生成 |
generate_pc_ply | bool | false | 点群PLY生成 |
generate_pc_osgb | bool | false | 点群OSGB生成(LOD) |
generate_pc_pnts | bool | false | 点群PNTS生成(3D Tiles) |
generate_geotiff | bool | false | オルソ画像生成 |
generate_tile_2D | bool | false | 2Dタイル生成 |
generate_2D_from_3D_model | bool | false | 3Dモデルからオルソ生成 |
オプションパラメータ - 座標系
パラメータ名 | 型 | デフォルト値 | 説明 |
---|---|---|---|
coordinate_system_3d | object | Local/LocalENU | 出力3D座標系 |
coordinate_system_2d | object | LocalENU | 出力2D座標系 |
オプションパラメータ - 高度機能
パラメータ名 | 型 | デフォルト値 | 説明 |
---|---|---|---|
gcp_path | string | - | 基準点ファイルパス |
gcp_coor_sys | object | - | 基準点座標系 |
use_image_position_constraint | bool | true | 画像位置制約を使用 |
fast_mode | bool | false | 高速モード(品質低下) |
min_avali_memory_size | float | 16.0 | 最小利用可能メモリ(GB) |
output_block_change_xml | bool | false | Block Exchange XML出力 |
📝 データ構造詳細
coordinate_systemオブジェクト
{
"type": 2, // 1=投影, 2=地理, 3=地心
"type_name": "Geographic",
"label": "WGS 84", // 座標系名称
"epsg_code": 4326 // EPSGコード
}
image_meta_data配列要素
基本形式(EXIF自動読み取り)
{
"id": 1, // 一意識別子
"path": "C:/Images/DJI_0001.JPG", // 画像パス
"group": "camera_1" // オプション:カメラグループ
}
完全形式(カスタムメタデータ)
{
"id": 1,
"path": "C:/Images/IMG_0001.JPG",
"group": "nadir", // カメラグループ名
"meta_data": { // カスタムメタデータ
"width": 6000, // 画像幅(ピクセル)
"height": 4000, // 画像高(ピクセル)
"pos": [114.123456, 22.123456, 100.5], // [経度, 緯度, 標高]
"pos_sigma": [0.05, 0.05, 0.10], // [X精度, Y精度, Z精度](メートル)
"focal_length": 24.0, // 焦点距離(ミリメートル)
"pixel_size": 0.00391 // ピクセルサイズ(ミリメートル)
}
}
カメラグループ(group)パラメータ
マルチカメラシステムで、異なるカメラの画像をグループ処理するために使用:
"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"}
]
一般的なグループ化シナリオ:
- 5目斜め撮影カメラ: nadir, oblique_forward, oblique_backward, oblique_left, oblique_right
- デュアルカメラシステム: wide_angle, telephoto
- マルチ機協働: drone_1, drone_2, drone_3
- マルチ時相: morning, afternoon
posとpos_sigmaパラメータ説明
posパラメータ:
- 形式:
[経度, 緯度, 標高]
または[X, Y, Z]
(座標系に依存) - 単位: 地理座標系では度とメートル、投影座標系ではメートル
- 用途: EXIFのGPS情報を上書きまたはGPSなし画像に位置を提供
pos_sigmaパラメータ:
- 形式:
[σ_X, σ_Y, σ_Z]
- 単位: メートル
- 意味: 各方向の位置測定標準偏差(1σ)
- 用途: 空中三角測量最適化で重みとして使用、精度が高い(σが小さい)ほど重みが大きい
典型的な値:
測位方式 | σ_X/σ_Y | σ_Z | 説明 |
---|---|---|---|
RTK固定解 | 0.02-0.05m | 0.05-0.10m | 最高精度 |
PPK後処理 | 0.03-0.08m | 0.08-0.15m | 高精度 |
通常GPS | 2-5m | 3-8m | 標準精度 |
手動推定 | 0.5-2m | 1-3m | 低精度 |
📝 設定例
最小設定
{
"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
}
マルチカメラグループ設定例
{
"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
},
// マルチカメラ画像グループ化
"image_meta_data": [
// 下視カメラ
{"id": 1, "path": "nadir/IMG_001.jpg", "group": "nadir"},
{"id": 2, "path": "nadir/IMG_002.jpg", "group": "nadir"},
// 前視斜めカメラ
{"id": 3, "path": "forward/IMG_001.jpg", "group": "oblique_f"},
{"id": 4, "path": "forward/IMG_002.jpg", "group": "oblique_f"},
// より多くのカメラグループ...
],
"generate_osgb": true,
"generate_3d_tiles": true
}
カスタムPOS設定例
{
"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
},
// 高精度PPK処理後の位置データを使用
"image_meta_data": [
{
"id": 1,
"path": "images/DJI_0001.JPG",
"meta_data": {
"width": 5472,
"height": 3648,
"pos": [114.305421, 22.596013, 120.543], // PPK処理後の精密位置
"pos_sigma": [0.03, 0.03, 0.05] // 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]
}
}
// ... より多くの画像
],
"generate_obj": true,
"generate_geotiff": true
}
完全設定例(GCPあり)
{
"license_id": 9200,
"working_dir": "D:/Projects/HighPrecision",
"gdal_folder": "D:/MipMap/SDK/data",
"input_image_type": 1,
"resolution_level": 1,
// 入力座標系 - WGS84
"coordinate_system": {
"type": 2,
"label": "WGS 84",
"epsg_code": 4326
},
// 出力座標系 - UTM
"coordinate_system_3d": {
"type": 3,
"label": "WGS 84 / UTM zone 50N",
"epsg_code": 32650
},
// 基準点
"gcp_path": "D:/Projects/HighPrecision/gcps.txt",
"gcp_coor_sys": {
"type": 3,
"label": "WGS 84 / UTM zone 50N",
"epsg_code": 32650
},
// 画像リスト
"image_meta_data": [
{"id": 1, "path": "D:/Data/flight1/IMG_001.JPG"},
{"id": 2, "path": "D:/Data/flight1/IMG_002.JPG"},
// ... より多くの画像
],
// すべての形式を出力
"generate_obj": true,
"generate_osgb": true,
"generate_3d_tiles": true,
"generate_las": true,
"generate_geotiff": true,
"generate_tile_2D": true
}
💾 出力構造
処理完了後、作業ディレクトリに以下の構造が生成されます:
working_dir/
├── products/ # 最終成果物
│ ├── models/ # 3Dモデル
│ │ ├── model.obj # OBJ形式
│ │ ├── model.mtl # マテリアルファイル
│ │ ├── textures/ # テクスチャ画像
│ │ └── tileset.json # 3D Tiles
│ ├── pointcloud/ # 点群データ
│ │ └── cloud.las # LAS形式点群
│ └── orthophoto/ # オルソ画像
│ ├── ortho.tif # GeoTIFF
│ └── tiles/ # タイルデータ
├── milestones/ # 中間結果
│ ├── at_result/ # 空三結果
│ ├── roi.json # ROI範囲
│ └── report.html # 処理レポート
└── log/ # ログファイル
└── log.txt # 詳細ログ
🎯 使用提案
適用シナリオ
- ✅ 高速なプロトタイピングとテスト
- ✅ 標準的な航空撮影プロジェクト
- ✅ 自動化バッチ処理
- ✅ 初心者学習
不適用シナリオ
- ❌ 処理パラメータの細密制御が必要
- ❌ 基準点の使用が必要
- ❌ 中間結果の確認が必要
- ❌ 特殊カメラやセンサー
🔧 高度なテクニック
1. 複数プロジェクトのバッチ処理
import json
import subprocess
from pathlib import Path
def batch_process(project_list):
for project in project_list:
# 設定を作成
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
}
# 設定を保存
config_path = f"./config_{project['name']}.json"
with open(config_path, 'w') as f:
json.dump(config, f, indent=2)
# 処理を実行
subprocess.run([
"reconstruct_full_engine.exe",
"-reconstruct_type", "0",
"-task_json", config_path
])
2. 自動パラメータ最適化
def optimize_parameters(image_count, available_memory_gb):
"""プロジェクト規模に基づいてパラメータを自動選択"""
# 解像度レベル
if image_count < 100:
resolution_level = 1 # 高精度
elif image_count < 500:
resolution_level = 2 # 中精度
else:
resolution_level = 3 # 低精度(大プロジェクト)
# 出力形式
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. 進捗監視
import re
import time
from threading import Thread
def monitor_progress(log_file):
"""処理進捗を監視"""
def read_progress():
with open(log_file, 'r') as f:
f.seek(0, 2) # ファイル末尾に移動
while True:
line = f.readline()
if line:
match = re.search(r'\[PROGRESS\] (\d+)%', line)
if match:
progress = int(match.group(1))
print(f"\r進捗: {'█' * (progress//2)}{'░' * (50-progress//2)} {progress}%", end='')
time.sleep(0.1)
thread = Thread(target=read_progress, daemon=True)
thread.start()
❓ よくある質問
Q: なぜ一部の画像が使用されなかったのですか?
A: ReconstructFullは品質の悪い画像を自動でフィルタリングします:
- ぼやけた画像
- GPS情報のない画像
- 重複または類似度の高い画像
ログでフィルタリングされた画像とその理由を確認できます。
Q: GPSのない画像を処理するには?
A: GPS情報のない画像については:
- ReconstructATインターフェースを使用(GPS無し処理をサポート)
- またはGPS情報を手動でEXIFに追加
- または外部POSファイルを使用
Q: 大規模プロジェクト処理でメモリ不足?
A: 解決策:
resolution_level
を2または3に下げる- 同時生成する出力形式を減らす
- ブロック処理を使用(他のインターフェースが必要)
🔗 関連リンク
- 座標系詳細説明
- 画像メタデータ説明
- 出力形式比較
- ReconstructATインターフェース(より多くの制御)
ReconstructFullはMipMapEngine SDKを使い始めるのに最適な選択肢です。経験を積むにつれて、より多くの制御を得るために他のインターフェースを探索できます。