واجهة ReconstructFull API
ReconstructFull هي واجهة إعادة البناء الشاملة الأبسط والأسهل استخداماً، مناسبة لبدء تشغيل المشاريع السريع والمستخدمين الجدد. تتعامل تلقائياً مع العملية الكاملة لاستخراج البيانات الوصفية للصور، وحساب التثليث الجوي، وإعادة البناء ثلاثي الأبعاد.
🎯 ميزات الواجهة
- ✅ مستوى أتمتة عالي: يقرأ تلقائياً معلومات GPS والكاميرا من EXIF للصور
- ✅ إعداد بسيط: الحد الأدنى المطلوب هو توفير مسار الصور فقط
- ✅ حل شامل: ينتج النتائج النهائية مباشرة من الصور
- ✅ تحسين ذكي: يختار تلقائياً أفضل معاملات المعالجة
📋 تفصيل المعاملات
المعاملات المطلوبة
اسم المعامل | النوع | الوصف | قيمة المثال |
---|---|---|---|
license_id | int | معرف ترخيص SDK | 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 | إنتاج تقويمية من النموذج ثلاثي الأبعاد |
المعاملات الاختيارية - نظام الإحداثيات
اسم المعامل | النوع | القيمة الافتراضية | الوصف |
---|---|---|---|
coordinate_system_3d | object | Local/LocalENU | نظام الإحداثيات ثلاثي الأبعاد للإخراج |
coordinate_system_2d | object | LocalENU | نظام الإحداثيات ثنائي الأبعاد للإخراج |
المعاملات الاختيارية - الوظائف المتقدمة
اسم المعامل | النوع | القيمة الافتراضية | الوصف |
---|---|---|---|
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"}
]
سيناريوهات التجميع الشائعة:
- كاميرا مائلة خماسية العدسات: 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]
(حسب نظام الإحداثيات) - الوحدة: درجات وأمتار للنظام الجغرافي، أمتار للنظام الإسقاطي
- الغرض: تجاوز معلومات GPS في EXIF أو توفير موضع للصور بدون 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/ # النماذج ثلاثية الأبعاد
│ │ ├── 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()
❓ الأسئلة الشائعة
س: لماذا لم يتم استخدام بعض الصور؟
ج: سيقوم ReconstructFull بتصفية الصور ذات الجودة المنخفضة تلقائياً:
- الصور المشوشة
- الصور بدون معلومات GPS
- الصور المكررة أو عالية التشابه
يمكنك مراجعة الصور المصفاة وأسبابها في السجل.
س: كيفية معالجة الصور بدون GPS؟
ج: للصور بدون معلومات GPS، تحتاج إلى:
- استخدام واجهة ReconstructAT (تدعم المعالجة بدون GPS)
- أو إضافة معلومات GPS يدوياً إلى EXIF
- أو استخدام ملف POS خارجي
س: نفدت الذاكرة أثناء معالجة مشروع كبير؟
ج: الحلول:
- تقليل
resolution_level
إلى 2 أو 3 - تقليل تنسيقات الإخراج المولدة في نفس الوقت
- استخدام معالجة مجزأة (يتطلب استخدام واجهات أخرى)
🔗 روابط ذات صلة
- تفصيل أنظمة الإحداثيات
- شرح البيانات الوصفية للصور
- مقارنة تنسيقات الإخراج
- واجهة ReconstructAT (مزيد من التحكم)
ReconstructFull هو الخيار الأفضل للبدء في استخدام MipMapEngine SDK. مع نمو الخبرة، يمكنك استكشاف واجهات أخرى للحصول على مزيد من التحكم.