حساب فاصلة الكاميرا من الأشياء باستخدام Python و OpenCV

باستخدام تحليل الحركة والتتبع القائم على المسار ، تمكنت من العثور على موقع الكرة في الفيديو. وبما أن حجم كرةالبيسبول معلوم، تمكنت أيضًا من تقدير المسافة إلى لوحة على الجدار.

كان مشروع مثير، على الرغم من أن جهاز التصوير لم يكن بالدقة المطلوبة – “ضبابية الحركة” للكرة بسبب حركتها السريعة، يصعب الحصول على تقديرات دقيقة.

في هذه المدونة ، سأوضح لك كيف توصلت إلى حل لحساب المسافة من الكاميرا إلى كائن أو علامة محددة.

تشابه المثلث للكائن / العلامة إلى مسافة الكاميرا

من أجل تحديد المسافة من الكاميرا إلى كائن أو علامة معروفة ، سنستخدم تشابه المثلث.

نستخدم تشابه المثلث كما يلي: لنفترض أن لدينا علامة أو كائنًا بعرض معروف W. ثم نضع هذه العلامة على مسافة D من الكاميرا. نلتقط صورة لكائننا باستخدام الكاميرا ثم نقيس العرض الظاهر بالبكسل P. وهذا يسمح لنا باشتقاق البعد البؤري ( Focal length ) للكاميرا:

F = (P x  D) / W

أو على سبيل المثال ، لنفترض وضعنا قطعة قياسية بحجم 8.5 × 11 بوصة من الورق (أفقيًا ؛ W = 11) D = 24 بوصة أمام الكاميرا والتقطنا صورة. عندما نقيس عرض قطعة الورق في الصورة ، نلاحظ أن العرض الملحوظ للورقة هو P = 248 بكسل.

الطول البؤري لدينا هو:

F = (248px x 24in) / 11in = 543.45

بينما أستمر في تحريك الكاميرا بالقرب من الكائن / العلامة، يمكنني تطبيق تشابه المثلث لتحديد مسافة الكائن إلى الكاميرا:

D’ = (W x F) / P

مرة أخرى ، لجعل هذا أكثر واقعية ، لنفترض أنني حركت كاميرتي 3 أقدام (أو 36 بوصة) بعيدًا عن قلمي وألتقط صورة لنفس قطعة الورق. من خلال المعالجة التلقائية للصور، يمكنني تحديد أن العرض لقطعة الورق يبلغ الآن 170 بكسل. بإدخال هذا في المعادلة نحصل الآن على:

D’ = (11in x 543.45) / 170 = 35in

أو 36 بوصة تقريبًا ، أي 3 أقدام.

ملاحظة: عندما التقطت الصور لهذا المثال، كان مقياس الشريط يحتوي على القليل من التراخي، وبالتالي فإن النتائج متوقفة عن 1 بوصة تقريبًا. علاوة على ذلك، قمت أيضًا بالتقاط الصور لم یکن بدقة 100 في 100، مما أضاف إلى خطأ 1 بوصة. لكن، لا يزال تشابه المثلث قائما ويمكنك استخدام هذه الطريقة لحساب المسافة من كائن أو علامة إلى الكاميرا بسهولة.

تحديد المسافة من الكاميرا إلى الكائن / العلامة باستخدام Python و OpenCV

افتح ملف جديد ، وسمه distance_to_camera.py
، وسنبدأ العمل:

أول شيء نفعله هو استيراد حزمنا الضرورية (الخطوط 2-5). سنستخدم المسارات من imutils لتحميل الصور المتاحة في دليل. سنستخدم NumPy للمعالجة العددية وcv.2
لارتباطات OpenCV الخاصة بنا.

من هناك نحدد دالة find_marker . تقبل هذه الدالة وسيطة، صورة والمقصود من استخدامها العثور على الكائن الذي نريد حساب المسافة إليه.

في هذه الحالة ، نستخدم قطعة ورق قياسية بحجم 8.5 × 11 بوصة كعلامة لدينا.

مهمتنا الأولى الآن هي العثور على قطعة الورق في الصورة.

للقيام بذلك، سنقوم بتحويل الصورة إلى تدرج رمادي، وطمسها قليلاً لإزالة التشويش عالي التردد، وتطبيق اكتشاف الحافة على الخطوط 9-11.

بعد تطبيق هذه الخطوات، يجب أن تبدو صورتنا كما يلي:

كما ترون، تم كشفها بوضوح. كل ما علينا فعله الآن هو إيجاد المحيط الذي يمثل قطعة الورق.

نجد علامتنا في الخطين 15 و 16 باستخدام دالة cv2.findContours (مع الحرص على التعامل مع إصدارات OpenCV المختلفة) ثم تحديد المحيط ذي المساحة الأكبر على الخط 17.

نفترض أن الكفاف الذي يحتوي على أكبر مساحة هي قطعة الورق.

في مثالنا، يعمل اكتشاف الحواف البسيط وإيجاد أكبر محيط بشكل جيد. يمكننا أيضًا نجعل هذا المثال أكثر قوة من خلال تطبيق تقريب الكنتور، وتجاهل أي ملامح لا تحتوي على 4 نقاط (نظرًا لأن قطعة الورق عبارة عن مستطيل وبالتالي بها 4 نقاط)، ثم إيجاد أكبر محيط مكون من 4 نقاط.

ملاحظة: يمكن العثور على المزيد عن هذه المنهجية في هذا المنشور حول إنشاء ماسح ضوئي للمستندات على الهاتف المحمول.

البدائل الأخرى للعثور على علامات في الصور هي استخدام اللون، بحيث يختلف لون العلامة اختلافًا كبيرًا عن باقي المشهد في الصورة. يمكنك أيضًا تطبيق طرق مثل اكتشاف نقطة المفاتيح ، والواصفات الثابتة المحلية ، ومطابقة نقطة المفاتيح للعثور على العلامات ؛ ومع ذلك ، هذه الطرق خارج نطاق هذه المقالة ويمكن البحث عنها.

بعد أن أصبح لدينا الآن المحيط الذي يتوافق مع العلامة، نعيد المربع المحيط الذي يحتوي على إحداثيات (x ، y) وعرض المربع وارتفاعه (بالبكسل) إلى دالة الاستدعاء في السطر 20.

دعنا أيضًا نحدد بسرعة دالة تحسب المسافة إلى كائن باستخدام تشابه المثلث المفصل أعلاه:

تأخذ هذه الدالة عرض معلوم للعلامة ، الطول البؤري المحسوب، والعرض لكائن في الصورة (يقاس بالبكسل) ، ويطبق تشابه المثلث لحساب المسافة الفعلية للكائن.

لنرى كيف نستخدم هذه الدوال، تابع القراءة:

تتمثل الخطوة الأولى لإيجاد المسافة إلى كائن أو علامة في صورة في معايرة وحساب الطول البؤري. للقيام بذلك ، نحتاج إلى معرفة:

  • مسافة الكاميرا من الجسم.
  • عرض هذا الكائن (بوحدات مثل البوصة والأمتار وما إلى ذلك). ملاحظة: يمكن أيضًا استخدام الارتفاع ، ولكن هذا المثال يستخدم العرض ببساطة.

في السطر 28 نقوم بتهيئة KNOWN_DISTANCE المعروف من الكاميرا إلى الكائن لدينا ليكون 24 بوصة. وفي السطر 32 نقوم بتهيئة KNOWN_WIDTH أن يكون حجم الكائن 11 بوصة (على سبيل المثال ، قطعة ورق قياسية مقاس 8.5 × 11 بوصة موضوعة أفقيًا).

الخطوة التالية مهمة: إنها خطوة معايرة بسيطة.

نقوم بتحميل أول صورة من القرص على السطر 37 – سنستخدم هذه الصورة كصورة معيارة.

بمجرد تحميل الصورة ، نجد العلامة على الصورة على السطر 38 ، ثم نحسب الطول البؤري على السطر 39 باستخدام تشابه المثلث.

الآن بعد “معايرة” نظامنا أصبح لدينا البعد البؤري ، يمكننا حساب المسافة من الكاميرا إلى العلامةفي الصور بسهولة .

نبدأ في الالتفاف حول مسارات الصور الخاصة بنا على الخط 42.

بعد ذلك ، لكل صورة في القائمة ، نقوم بتحميل الصورة على السطر 45 ، والعثور على العلامة في الصورة على السطر 46 ، ثم نحسب مسافة الكائن إلى الكاميرا في السطر 47.

من هناك ، نقوم ببساطة برسم المربع المحيط حول العلامة الخاصة بنا وعرض المسافة على الأسطر 50-57 (the boxPoints)محسوبة على السطر 50 مع مراعاة التعامل مع إصدارات OpenCV المختلفة).

النتائج

لرؤية البرنامج النصي قيد التنفيذ ، افتح Terminal ، وانتقل إلى مسار برنامجك ، نفيذ الأمر التالي:

python distance_to_camera.py

إذا سارت الأمور على ما يرام ، يجب أن ترى نتائج 2ft.png، وهي الصورة التي نستخدمها “لمعايرة” (Calibration) نظامنا وحساب الطول البؤري الأولي:

من الصورة أعلاه يمكننا نرى أن البعد البؤري لدينا محدد بشكل صحيح وأن المسافة إلى قطعة الورق هي 2 قدم ، لكل KNOWN_DISTANCE و KNOWN_WIDTH المتغيرات في الكود.

الآن بعد أن أصبح لدينا البعد البؤري ، يمكننا حساب المسافة إلى العلامة الخاصة بنا في الصور اللاحقة:

ملخص :

في هذه المدونة، تعلمنا كيفية تحديد المسافة من كائن معروف في صورة إلى الكاميرا.

لإنجاز هذه المهمة ، استخدمنا تشابه المثلث ، والذي يتطلب منا معرفة معلمتين مهمتين قبل تطبيق الخوارزمية لدينا:

  • العرض (أو الارتفاع)، للكائن الذي نستخدمه كعلامة.
  • مسافة الكاميرا (بالبوصة أو بالأمتار) إلى العلامة في الخطوة 1.

يمكن بعد ذلك استخدام خوارزميات رؤية الكمبيوتر ومعالجة الصور لتحديد العرض / الارتفاع الكائن بالبكسل وإكمال تشابه المثلث ومنحنا البعد البؤري.

مرجع:
https://www.pyimagesearch.com/2015/01/19/find-distance-camera-objectmarker-using-python-opencv/

منشور ذات صلة

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

السلة