5.22. تصحيح العدسة والمنظور¶
هناك فئتان من التصحيح الهندسي تعملان على تشويه الصورة بطرق لا يمكن لتعيين مستطيل إلى مستطيل تحقيقها. تصحيح العدسة يلغي التشوه الشعاعي الذي تُدخله العدسة الواسعة الزاوية الحقيقية -- انتفاخ عين السمكة الذي يحني خطوط المشهد المستقيمة إلى منحنيات مرئية بالقرب من زوايا الإطار. تصحيح المنظور يلغي تأثير حجر الزاوية الذي يحدث عندما لا تكون العدسة موجهة بشكل عمودي على المشهد -- التشويه شبه المنحرف الذي يحوّل مستطيلًا معروفًا في العالم إلى كتلة غير مستطيلة في الصورة. كلا التصحيحين يلغيان، بعد اكتمال الالتقاط، تأثيرات أصلها بصري.
5.22.1. تشوه العدسة الشعاعي¶
تصف مادة تأثيرات العدسة الحقيقية التشوه البرميلي الذي تُدخله العدسات الواسعة الزاوية الرخيصة. البكسلات القريبة من مركز الإطار تقع تقريبًا حيث يتنبأ نموذج الثقب الدبوسي؛ أما البكسلات القريبة من الحواف فتنحني للخارج بمقدار يزداد مع مربع المسافة الشعاعية عن المحور البصري. الخط المستقيم في المشهد الذي يمتد بالقرب من حافة الإطار ينحني بشكل واضح في الصورة الملتقطة، وأي خوارزمية رؤية آلية كلاسيكية تفترض أن الخطوط المستقيمة تبقى مستقيمة -- كشف زوايا AprilTag، وتتبع الحواف، والملاحة بتتبع الخطوط -- تحصل على إجابة خاطئة بالقرب من الزوايا.
lens_corr() يلغي التشوه. تُجري الطريقة التعيين العكسي: كل بكسل خرج يُؤخذ من الموضع في الدخل الذي كانت العدسة لتحنيه للخارج عنه، والنتيجة صورة مستقيمة هندسيًا.
img.lens_corr(strength=1.8)
المُعامل strength هو جوهر التصحيح. وهو رقم واحد يصف مدى قوة انحناء العدسة؛ القيمة القريبة من 1.0 هي تصحيح خفيف لعدسة واسعة معتدلة، والقيم حتى نحو 2.0 معقولة لعين سمكة قوية. القيمة الافتراضية 1.8 نقطة بداية معقولة لعدسات OpenMV Cam القياسية؛ والقيمة الصحيحة لأي عدسة محددة مسألة تجربة بضع قيم ومراقبة الصورة.
المُعاملان الجانبيان عادةً ما يكونان مناسبين بقيمهما الافتراضية. zoom (الافتراضي 1.0) يقيس الخرج -- القيمة الأكبر من واحد تقتطع للخارج لتعويض الطريقة التي يدفع بها تصحيح العدسة الزوايا أبعد للخارج؛ والقيم الأصغر تترك مزيدًا من المشهد المصحح مرئيًا على حساب تضمين بكسلات فارغة عند حواف الصورة. x_corr و y_corr يزيحان مركز التصحيح بعيدًا عن المركز الهندسي للصورة، وهو ما يفيد عندما لا تكون العدسة مركزة بصريًا فوق المستشعر (حالة غير معتادة لكن جديرة بالمعرفة).
خط أنابيب نموذجي: التقط، شغّل lens_corr() مرة واحدة لتقويم الهندسة، ثم شغّل ما يفعله التطبيق فعليًا بالنتيجة.
5.22.2. تصحيح الدوران ثلاثي الأبعاد¶
الفئة الأخرى من التشوه الهندسي هي تشويه المنظور الذي يحدث عندما لا يكون مستوى المستشعر موازيًا لمستوى المشهد. الحالة الكلاسيكية هي لافتة أو لوحة ترخيص مرئية من الأسفل: قمة اللافتة أبعد عن العدسة من قاعدتها، فتُسقَط أصغر، وتُظهر الصورة الملتقطة المستطيل على شكل شبه منحرف حافته العلوية أقصر من حافته السفلية.
الحل هو تطبيق دوران ثلاثي الأبعاد على الإطار الملتقط يعيد توجيه مستوى المستشعر افتراضيًا ليكون موازيًا لمستوى المشهد. الرياضيات هي نفس تعيين المنظور الذي يستخدمه كشف AprilTag لاستعادة وضعية الوسم من زواياه الأربع، مُشغّلة بشكل عكسي: بإعطاء دوران، تعيّن العملية كل بكسل خرج إلى موضع الدخل الذي كان الدوران ليأتي منه.
rotation_corr() يُجري ذلك التصحيح:
img.rotation_corr(x_rotation=10.0, y_rotation=0.0, z_rotation=0.0)
مُعاملات الدوران الثلاثة بالدرجات وتصف الدورانات حول المحاور x و y و z لكاميرا افتراضية مركزها الصورة. x_rotation يميل الكاميرا للأعلى أو للأسفل (التصحيح الطبيعي للقطة جدار على مستوى الأرض)؛ و y_rotation يحرّك الكاميرا أفقيًا يمينًا أو يسارًا؛ و z_rotation يدوّر الكاميرا حول محورها البصري (التصحيح الطبيعي لتركيب غير مستوٍ).
x_translation و y_translation يحركان الكاميرا الافتراضية جانبيًا دون تدويرها. zoom (الافتراضي 1.0) يقيس الخرج. fov (الافتراضي 60.0) يصف مجال الرؤية الرأسي للكاميرا، ويُستخدم لحساب الإسقاط -- وينبغي أن تطابق القيمة العدسة الفعلية للحفاظ على اتساق الهندسة.
بالنسبة لتركيبة إمالة ودوران أفقي اعتباطية، تتركب عدة دورانات غير صفرية في استدعاء واحد. ترتيب العمليات ثابت داخل التنفيذ؛ والتطبيق يوفر الزوايا فقط وتخرج النتيجة.
5.22.3. تقويم مستطيل معروف¶
الصيغة الأكثر فائدة شائعةً من rotation_corr() هي الكلمة المفتاحية corners=، التي تأخذ قائمة من أربع صفوف (x, y) تصف زوايا مستطيل معروف في صورة الدخل. تحسب الطريقة الدوران ثلاثي الأبعاد الذي كان ليُعيّن مستطيلًا حقيقيًا إلى تلك النقاط الأربع المحددة، ثم تطبّق معكوس ذلك الدوران على الصورة بأكملها، وتُرجع نتيجة يكون فيها المستطيل المعروف مستطيلًا مجددًا:
plate_corners = [(45, 80), (300, 60), (310, 180), (40, 200)]
img.rotation_corr(corners=plate_corners)
الاستخدام الكلاسيكي هو بالضبط ما يوحي به الاسم: لوحة ترخيص (أو أي ميزة مستطيلة أخرى) مُصوّرة من زاوية مائلة. تكتشف مرحلة سابقة اللوحة وتُبلّغ عن مواضع زواياها الأربع في الصورة الملتقطة؛ وتمرير تلك الزوايا إلى rotation_corr() يُنتج صورة تقع فيها اللوحة كمستطيل حقيقي، جاهزة لأي مرحلة تعرّف على المحارف أو مطابقة قوالب تأتي بعدها.
عندما تحل صيغة الزوايا الأربع المشكلة التي يحاول التطبيق حلها، تكون أكثر فائدة بشكل كبير من صيغة المُعاملات الستة. لا يضطر التطبيق إلى تقدير أي زوايا دوران؛ بل يسلّم الطريقة أربع نقاط ويدعها تستنتج الباقي. أما صيغة المُعاملات الستة فتفيد عندما لا يكون هناك مستطيل يمكن تمييزه مرئيًا في المشهد ويتعين ضبط الدوران يدويًا من معرفة خارجية (زاوية تركيب معايرة، على سبيل المثال).