
اليوم نريد أن نشارك سلسلة من الأمثلة على بيثون لمتعلمي OpenCV على Raspberry Pi ، وهي لوحة StereoPi ذات الغرف المزدوجة. ستساعدك الشفرة النهائية (بالإضافة إلى صورة Raspbian) على متابعة جميع الخطوات ، بدءًا من التقاط صورة وتنتهي بالحصول على خريطة عمق من الفيديو الملتقط.
خلفية
يجب أن أؤكد على الفور أن هذه الأمثلة لغمر مريح في الموضوع ، وليس لحل إنتاج. إذا كنت من مستخدمي OpenCV المتقدمين وكنت تتعامل مع التوت ، فأنت تعلم أنه من أجل التشغيل الصحيح ، يُنصح باستخدام شفرة لدغة ، وحتى استخدام GPU التوت. في نهاية المقال ، سأتطرق إلى "اختناقات" حل الثعبان والأداء العام بمزيد من التفصيل.
ما الذي نعمل به؟
لدينا مثل هذا الإعداد مثل الحديد:

لوحة StereoPi على متن وحدة Raspberry Pi Compute Module 3+. تتصل أبسط الكاميرات بإصدار Raspberry Pi الإصدار V1 (على جهاز استشعار ov5647).
ما هو مثبت:
- امتداد Raspbian (نواة 4.14.98-v7 +)
- بيثون 3.5.3
- OpenCV 3.4.4 (تم تجميعه مسبقًا ، "نقطة" من Python Wheels)
- بيكاميرا 1.13
- StereoVision lib 1.0.3 (https://github.com/erget/StereoVision)
تتعدى عملية تثبيت جميع البرامج نطاق هذه المقالة ، ونقترح فقط تنزيل صورة Raspbian النهائية (روابط إلى github في نهاية المقالة).
الخطوة الأولى: التقاط صورة
للقيام بذلك ، استخدم البرنامج النصي 1_test.py
افتح وحدة التحكم ، انتقل من المجلد الرئيسي إلى المجلد مع أمثلة:
cd stereopi-tutorial
قم بتشغيل البرنامج النصي:
python 1_test.py
بعد البدء ، يتم عرض معاينة لصورة الاستريو على الشاشة. يمكن مقاطعة العملية عن طريق الضغط على زر Q. سيؤدي هذا إلى حفظ آخر صورة تم التقاطها ، والتي سيتم استخدامها في أحد البرامج النصية التالية لتكوين خريطة العمق.
يتيح لك هذا البرنامج النصي التأكد من أن جميع الأجهزة تعمل بشكل صحيح ، وكذلك الحصول على الصورة الأولى للاستخدام في المستقبل.
إليك ما يبدو عليه النص الأول:
الخطوة الثانية: جمع الصور للمعايرة
إذا تحدثنا عن حصان كروي في فراغ ، فلكي نحصل على خريطة عمق جيدة الجودة ، نحتاج إلى امتلاك كاميرتين متطابقتين تمامًا ، يكون المحوران العمودي والضوئي متوازيين تمامًا ، ويتزامن المحاور الأفقية. ولكن في العالم الواقعي ، تختلف جميع الكاميرات قليلاً ، ولا يمكن ترتيبها تمامًا. لذلك ، تم اختراع خدعة معايرة البرامج. باستخدام كاميرتين من العالم الواقعي ، يتم التقاط عدد كبير من الصور لكائن معروف سابقًا (لدينا صورة مع رقعة الشطرنج) ، ثم تقوم خوارزمية خاصة بحساب جميع "العيوب" وتحاول تصحيح الصور بحيث تكون قريبة من المثالية.
يقوم هذا البرنامج النصي بتنفيذ المرحلة الأولى من العمل ، أي أنه يساعد في عمل سلسلة من الصور للمعايرة.
قبل كل صورة ، يبدأ البرنامج النصي العد التنازلي لمدة 5 ثوان. هذه المرة ، كقاعدة عامة ، كافية لنقل اللوحة إلى موضع جديد ، للتأكد من عدم زحفها على كلتا الكاميرتين فوق الحواف ، وتحديد موضعها (بحيث لا توجد ضبابية في الصورة). افتراضيًا ، يتم ضبط حجم السلسلة على 30 صورة.
تشغيل:
python 2_chess_cycle.py
عملية:
نتيجة لذلك ، لدينا سلسلة من الصور في مجلد / scenes.
نقطع الصور إلى أزواج
يقوم النص الثالث 3_pairs_cut.py بقص الصور التي تم التقاطها في صور "يسار" و "يمين" ويحفظها في مجلد / pairs. في الواقع ، يمكننا استبعاد هذا السيناريو والقيام بعملية القطع ، لكنه مفيد للغاية في مزيد من التجارب. على سبيل المثال ، يمكنك حفظ الشرائح من سلسلة مختلفة ، أو استخدام البرامج النصية الخاصة بك للعمل مع هذه الأزواج ، أو حتى راحة الصور التي التقطت على كاميرات ستيريو أخرى كأزواج.
بالإضافة إلى ذلك ، قبل قص كل صورة ، يعرض النص صورته ، والتي تسمح لك غالبًا بمشاهدة الصور الفاشلة قبل خطوة المعايرة التالية وحذفها ببساطة.
قم بتشغيل البرنامج النصي:
python 3_pairs_cut.py
فيديو قصير:
في الصورة النهائية ، هناك مجموعة من الصور الفوتوغرافية والأزواج المقطوعة التي استخدمناها في تجاربنا.
معايرة
يرسم البرنامج النصي 4_calibration.py جميع الأزواج باستخدام لوحات الشطرنج ويحسب التصحيحات اللازمة لتصحيح الصور. في البرنامج النصي ، تم الرفض التلقائي للصور الفوتوغرافية التي لم يتم العثور على رقعة الشطرنج فيها ، بحيث لا يتوقف العمل في حالة الصور الفوتوغرافية غير الناجحة. بعد تحميل جميع الأزواج الثلاثين من الصور ، يبدأ الحساب. يستغرق حوالي دقيقة ونصف معنا. بعد الانتهاء ، يأخذ البرنامج النصي أحد أزواج الاستريو ، وعلى أساس معلمات المعايرة المحسوبة "يصححها" ، ويعرض صورة مصححة على الشاشة. في هذه المرحلة ، يمكنك تقييم جودة المعايرة.
تديرها القيادة:
python 4_calibration.py
سيناريو المعايرة في العمل:
إعداد خريطة العمق
يقوم البرنامج النصي 5_dm_tune.py بتحميل الصورة التي تم التقاطها بواسطة البرنامج النصي الأول ونتائج المعايرة. بعد ذلك ، يتم عرض واجهة تسمح لك بتغيير إعدادات خريطة العمق ومعرفة التغييرات. نصيحة: قبل تعيين المعلمات ، خذ إطارًا سيكون لديك به كائنات في وقت واحد على مسافات مختلفة: قريب (30-40 سم) ، على مسافة متوسطة (متر أو اثنين) وفي المسافة. سيسمح لك هذا باختيار المعلمات التي ستكون فيها الكائنات القريبة باللون الأحمر وستكون الكائنات البعيدة باللون الأزرق الغامق.
تحتوي الصورة على ملف به إعدادات خريطة العمق الخاصة بنا. يمكنك تحميل إعداداتنا في برنامج نصي ببساطة عن طريق النقر على زر "تحميل إعدادات"
نطلق:
python 5_dm_tune.py
إليك ما تبدو عليه عملية الإعداد:
الوقت الحقيقي خريطة العمق
يقوم النص الأخير 6_dm_video.py بإنشاء خريطة عمق من الفيديو باستخدام نتائج البرامج النصية السابقة (معايرة وإعداد خريطة العمق).
تشغيل:
python 6_dm_video.py
في الواقع النتيجة:
نأمل أن تكون نصوصنا مفيدة في تجاربك!
فقط في حالة ، سأضيف أن جميع النصوص تحتوي على معالجة ضغط المفاتيح ، ويمكنك مقاطعة العمل عن طريق الضغط على زر Q. إذا توقفت "تقريبًا" ، على سبيل المثال ، Ctrl + C ، فقد تتوقف عملية تفاعل Python مع الكاميرا ، وستكون إعادة تشغيل التوت مطلوبة.
لالمتقدمة
- يعرض البرنامج النصي الأول في العملية متوسط الوقت بين التقاط الإطارات ، وعند الانتهاء ، متوسط FPS. هذه أداة بسيطة ومريحة لتحديد معلمات الصور التي لا يزال "الثعبان" فيها لا يختنق. باستخدامه ، التقطنا 1280 × 480 بسرعة 20 إطارًا في الثانية ، حيث يتم عرض الفيديو دون تأخير.
- قد تلاحظ أننا نلتقط زوج ستيريو بدقة 1280 × 480 ، ثم نقيسه إلى 640 × 240.
سؤال معقول: لماذا كل هذا ، ولماذا لا تنتزع الصورة المصغرة على الفور ولا تقم بتحميل الثعبان لدينا عن طريق الحد منه؟
الإجابة: مع الالتقاط المباشر بدقة منخفضة للغاية ، لا تزال هناك مشاكل في جوهر التوت (فواصل الصورة). لذلك ، نأخذ دقة أكبر ، ومن ثم نقوم بتقليل الصورة. نحن هنا نستخدم خدعة صغيرة: لا يتم تحجيم الصورة باستخدام الثعبان ، ولكن بمساعدة وحدة معالجة الرسومات ، لذلك لا يوجد أي حمل على قلب الذراع. - لماذا التقاط الفيديو بتنسيق BGRA ، وليس BGR؟
نستخدم موارد GPU لتقليل حجم الصورة ، والنسخة الأصلية لوحدة تغيير الحجم هي تنسيق BGRA. إذا استخدمنا BGR بدلاً من BGRA ، فسنكون لدينا عيبان. الأول أقل قليلاً من FPS النهائي (في اختباراتنا - 20 بالمائة). والثاني هو القلق المستمر في وحدة التحكم "PiCameraAlfaStripping: استخدام alpha-stripping للتحويل إلى تنسيق غير alpha؛ قد تجد تنسيق ألفا المكافئ أسرع ". أدى غوغلينغ منها إلى قسم وثائق بيكاميرا ، الذي يصف هذه الخدعة. - أين هو بيرغباري؟
هذا يشبه فئة Picamera الأصلية للعمل مع الكاميرا ، ولكن هنا لا يتم استخدامه. لقد تبين بالفعل أنه في الاختبارات التي أجريناها ، يكون العمل مع صفيف "يدوي الصنع" أسرع بكثير (حوالي مرة ونصف) من استخدام PiRGBArray. هذا لا يعني أن PiRGBArray أمر سيئ ، على الأرجح هذه هي أيدينا الملتوية. - كيف يتم تحميل المئة في حساب خريطة العمق؟
دعنا نجيب مع صورة:

نرى أن من بين النوى الأربعة للمعالج ، يتم تحميل واحد فقط في الأساس ، وهذا هو 70 ٪. وهذا على الرغم من حقيقة أننا نعمل مع واجهة المستخدم الرسومية ، ونقوم بإخراج الصور وخرائط العمق للمستخدم. هذا يعني أن هناك هامشًا جيدًا للأداء ، كما أن ضبط OpenCV مع OpenMP والأشياء الجيدة الأخرى في C ، بالإضافة إلى وضع "القتال" بدون واجهة المستخدم الرسومية يمكن أن يعطي نتائج مهمة للغاية. - ما هي خريطة عمق FPS القصوى التي تم الحصول عليها من خلال هذه الإعدادات؟
كان الحد الأقصى الذي حققناه هو 17 إطارًا في الثانية ، عند التقاط 20 إطارًا في الثانية من الكاميرا. الأكثر "استجابة" من حيث معلمات السرعة في إعدادات خريطة العمق هي MinDisparity و NumOfDisparities. هذا منطقي ، لأنه يحدد عدد "الخطوات" التي يتم تنفيذها داخل الخوارزمية بواسطة نافذة البحث لمقارنة الإطارات. الثاني الأكثر استجابة هو preFilterCap ؛ فهو يؤثر ، على وجه الخصوص ، على "نعومة" خريطة العمق. - ماذا عن درجة حرارة المعالج؟
في Compute Module 3+ Lite (سلسلة جديدة ، مع وجود غطاء حديدي على العملية) تظهر النتائج التالية تقريبًا:

- كيفية استخدام GPU؟
كحد أدنى ، يمكن استخدامه لاستعادة الصور وتصحيحها في الوقت الفعلي ، لأن هناك أمثلة ( هنا على WebGL ) ، Python Pi3d ، وكذلك مشروع المعالجة ( أمثلة على التوت ).
هناك تطور آخر مثير للاهتمام من قبل كويتشي ناكامورا ، يسمى py-videocore . في مراسلاتنا معه ، أعرب عن فكرة أنه لتسريع StereoBM يمكنك استخدام أنواعها الأساسية و OpenCV بدعم Cuda . بشكل عام ، لتحسين - حافة يمسها ، كما يقولون.
شكرا لك على اهتمامك ، وهنا
الرابط الموعود بالمصدر .