احسب عرض البانوراما من صور متداخلة مجانًا
قبل دمج صورة بانورامية، من المفيد معرفة عرض اللوحة النهائية. تأخذ هذه الآلة الحاسبة المجانية أبعاد كل لقطة متداخلة بالبكسل والنسبة المقدَّرة للتداخل الأفقي بين الإطارات المتتالية، ثم تُعيد عرض البانوراما الناتج وإجمالي التداخل بالبكسل وارتفاع البانوراما عندما تُصرِّح كل صورة عن ارتفاعها.
شغّل الأداة مجانًا
تعمل الأداة بالكامل في متصفحك ولا تكلف شيئًا للاستخدام التفاعلي، والحساب نفسه متاح عبر API مقابل $0.002 لكل طلب عندما تحتاج إليه داخل مسار عمل آلي.
كيف يُقدَّر عرض البانوراما
البانوراما المُدمجة ليست مجرد مجموع عروض الصور الفردية، لأن الإطارات المتتالية تتداخل. تنتقل هذه الأداة عبر قائمة صورك من اليسار إلى اليمين، بالترتيب نفسه الذي ستدمجها به. ولكل زوج متجاور تحسب المنطقة المشتركة: نسبة التداخل التي تقدمها مطبَّقةً على العرض الأضيق من العرضين. اختيار العرض الأضيق هو الخيار الأكثر تحفظًا ومنطقية من الناحية الفيزيائية، فالشريط المتداخل لا يمكن أن يكون أعرض من أيٍّ من الصورتين اللتين تتشاركانه. ثم يُطرح هذا التداخل بالبكسل عند إضافة الإطار التالي، فيزداد المجموع التراكمي بمقدار الشريط الجديد غير المكرر فقط من كل صورة. والنتيجة هي العرض التقديري النهائي للوحة بالبكسل. ولأن الحساب مجرد مجموع حاصل ضرب، فالتقدير دقيق تمامًا بالنسبة للنِّسب التي تُدخلها؛ وعدم اليقين الوحيد يكمن في مدى تطابق تقديراتك للتداخل مع ما التقطته الكاميرا فعلًا. عند التصوير اليدوي تكون نِّسب التداخل بين 20% و40% شائعة، بينما يتيح لك رأس بانورامي على حامل ثلاثي التخطيط لقيم أضيق وأكثر قابلية للتنبؤ.
ما الذي تُدخله وما الذي تحصل عليه
المدخل هو قائمة بسجلات الصور بترتيب الدمج. يحتاج كل سجل إلى عرض بالبكسل؛ أما الارتفاع فاختياري، وoverlap_pct هو التداخل الأفقي الذي تتشاركه تلك الصورة مع التالية، مُعبَّرًا عنه كنسبة مئوية من 0 حتى أقل من 100. الصورة الأخيرة ليس لها جار تالٍ، لذا تُتجاهَل قيمة التداخل الخاصة بها. يمنحك الناتج image_count وتقدير panorama_width وقيمة total_overlap_px (عدد البكسلات المكررة عبر جميع الوصلات) وsum_widths_px (المجموع الساذج لو تجاهلت التداخل) وpanorama_height متى صرَّح كل سجل عن ارتفاع — ويُؤخذ كأكبر قيمة لأن اللوحة يجب أن تتسع لأطول إطار. يُرفض تداخل بنسبة 100% أو أكثر برسالة خطأ واضحة، لأن إطارين متداخلين تمامًا لا يضيفان معلومات جديدة ويشيران عادةً إلى إدخال خاطئ. تُقرَّب جميع القيم إلى ست خانات عشرية لتكون النتائج مستقرة وقابلة للمقارنة بين التشغيلات.
نصائح تخطيط لدمج أفضل
استخدم هذا التقدير قبل التصوير أو قبل تخصيص مساحة قرص للوحة ضخمة. إذا كنت تعرف عدستك وحجم المستشعر وزاوية الدوران بين اللقطات، فيمكنك اشتقاق نسبة التداخل من مجال الرؤية الأفقي: الكسر المكرر من الإطار يساوي واحدًا ناقص الخطوة الزاوية مقسومةً على مجال الرؤية. أدخل النسبة نفسها لكل وصلة عند مسح منتظم، أو غيِّرها لكل زوج عندما عدَّلت خطوتك أثناء التسلسل. حافظ على تداخل لا يقل عن 15% ليتوفر لبرنامج الدمج ما يكفي من السمات المطابقة، وفضِّل 30% أو أكثر في المشاهد قليلة التفاصيل كالسماء أو الماء. إذا جاء التقدير أعرض بكثير مما يدعمه محررك أو طابعتك، فقلِّل عدد الإطارات أو زد التداخل بحيث يسهم كل إطار بمساحة جديدة أقل، أو خطِّط لتصغير اللوحة النهائية. ولأن هذه الحاسبة حتمية وفورية، يمكنك تكرار التجربة على أعداد الإطارات ونِّسب التداخل بحرية حتى يناسب الحجم المتوقَّع هدفك.
حالات الاستخدام
تخطيط ما قبل التصوير للبانوراما الطبيعية
مصوِّر يخطط لمسح من خمسة إطارات لأفق المدينة يُدخل عرض كل إطار والتداخل المقصود بنسبة 30% للتأكد من أن اللوحة النهائية ستكون عريضة بما يكفي لطباعة كبيرة قبل مغادرة المنزل.
تحديد حجم اللوحة والتخزين لأعمال الجيجابكسل
استوديو يبني فسيفساء جيجابكسل من عشرات إطارات التقريب البعيد يقدِّر العرض المُدمج للتحقق من الذاكرة وقرص العمل المؤقت وحدود التصدير في برنامج الدمج قبل الجلسة.
التحقق من سلامة مسار دمج آلي
مطوِّر يعالج دفعات من تسلسلات صور الطائرات المسيَّرة يستدعي API مقابل $0.002 لكل طلب للتنبؤ بأبعاد الناتج، مع تمييز التسلسلات التي ستنتج مدخلات التداخل فيها نتيجة ضيقة أو عريضة بشكل مستحيل.
الأسئلة الشائعة
لماذا لا تساوي البانوراما مجموع عروض جميع الصور؟
لأن الإطارات المتتالية تتداخل. يُطرح الشريط المكرر بين كل زوج، فيكون العرض النهائي هو مجموع العروض ناقص تداخل كل وصلة بالبكسل.
كيف يُحسب التداخل بين صورتين؟
تُطبَّق نسبة التداخل التي تُدخلها على العرض الأضيق من العرضين في كل زوج متجاور، لأن المنطقة المشتركة لا يمكن أن تكون أعرض من أيٍّ من الصورتين. ثم تُطرح تلك القيمة بالبكسل عند إضافة الإطار التالي.
ماذا يحدث إذا أدخلت تداخلًا بنسبة 100% أو أكثر؟
يُرفض الطلب بوصفه إدخالًا غير صالح. التداخل الكامل يعني أن الصورة الثانية لا تضيف مساحة جديدة، وهذا يناقض فكرة الدمج ويشير دائمًا تقريبًا إلى خطأ في إدخال البيانات.
هل يهم ترتيب الصور؟
نعم. تُعالَج السجلات بترتيب الدمج من اليسار إلى اليمين، ويصف كل overlap_pct الوصلة بين تلك الصورة والتالية لها. وتُتجاهَل قيمة التداخل للصورة الأخيرة.
هل يمكنني تقدير ارتفاع البانوراما أيضًا؟
نعم. عندما يتضمن كل سجل صورة ارتفاعًا، يشمل الناتج panorama_height ويُؤخذ كأكبر ارتفاع لتتسع اللوحة لأطول إطار. وإذا غاب أي ارتفاع، يُحذف الحقل.
هل الأداة مجانية، وهل تعمل عبر الإنترنت؟
الاستخدام التفاعلي يعمل بالكامل في متصفحك مجانًا دون رفع أي شيء. والحساب نفسه متاح أيضًا عبر API مقابل $0.002 لكل طلب لمسارات العمل المؤتمتة.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/image/stitch-panorama-estimate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"images":[{"width":4000,"height":3000,"overlap_pct":30},{"width":4000,"height":3000,"overlap_pct":25},{"width":4000,"height":3000}]}'const res = await fetch("https://api.kit.forhosting.com/image/stitch-panorama-estimate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"images": [
{
"width": 4000,
"height": 3000,
"overlap_pct": 30
},
{
"width": 4000,
"height": 3000,
"overlap_pct": 25
},
{
"width": 4000,
"height": 3000
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/image/stitch-panorama-estimate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"images": [
{
"width": 4000,
"height": 3000,
"overlap_pct": 30
},
{
"width": 4000,
"height": 3000,
"overlap_pct": 25
},
{
"width": 4000,
"height": 3000
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/image/stitch-panorama-estimate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"images":[{"width":4000,"height":3000,"overlap_pct":30},{"width":4000,"height":3000,"overlap_pct":25},{"width":4000,"height":3000}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"images":[{"width":4000,"height":3000,"overlap_pct":30},{"width":4000,"height":3000,"overlap_pct":25},{"width":4000,"height":3000}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/image/stitch-panorama-estimate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"images": [
{
"width": 4000,
"height": 3000,
"overlap_pct": 30
},
{
"width": 4000,
"height": 3000,
"overlap_pct": 25
},
{
"width": 4000,
"height": 3000
}
]
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "image.stitch_panorama_estimate",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الحدود
max_items | 200 |
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |