سؤال

أريد تتبع نقطة ضوء الليزر (الموجودة على الحائط) باستخدام كاميرا ويب وأنا أستخدم openCV للقيام بهذه المهمة.هل يمكن لأي شخص أن يقترح لي طريقة للقيام بذلك باستخدام C++.

شكرًا لك !

هل كانت مفيدة؟

المحلول

لديك ثلاثة خيارات اعتمادًا على استقرار الخلفية الخاصة بك، والأشياء التي تريد القيام بها بالصورة.

يمكنك جعل صورتك داكنة جدًا بحيث لا يمكنك رؤيتها إلا نقطة الليزر.يمكنك القيام بذلك عن طريق إغلاق الحجاب الحاجز و/أو تقليل وقت الغالق.حتى مع كاميرات الويب الرخيصة، يمكن عادةً القيام بذلك في برنامج التشغيل.بمجرد الانتهاء من ذلك، تصبح مهمة العثور على نقطة الليزر سهلة للغاية.يمكنك جعل الصورة مظلمة قدر الإمكان لأن النقطة التي يلمع فيها الليزر عادة ما تكون مشرقة جدًا بحيث لا تتمكن الكاميرا من التقاطها.هذا يعني (كما خبرتك) أنه لا يمكنك التمييز بين نقطة الليزر الضوئية والأجسام الضوئية الأخرى في الصورة.بجعلها أكثر قتامة يمكنك الآن القيام بذلك.

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

أخيرًا، إذا كانت خلفيتك غير مستقرة ولا تريد أن تجعل صورتك داكنة جدًا، فإن خيارك الأخير هو البحث عن جميع وحدات البكسل الساطعة جدًا والأكثر سطوعًا في القناة الحمراء مقارنةً باللونين الأخضر والأزرق (إذا أنت تستخدم الليزر الأحمر).سيظل هذا النظام مشتتًا بسبب البقع البيضاء، ولكن ليس بقدر مجرد العثور على وحدات البكسل الساطعة.إذا كان مركز نقطة مؤشر الليزر يظهر بالفعل باللون الأبيض الساطع بغض النظر عن لون الليزر، فإن هذه التقنية ستسمح لك بالعثور على "حلقات" حول هذه النقطة المضيئة (الجزء الخارجي من النقطة حيث لا يكون الليزر ساطعًا مثل وهو في المنتصف بحيث يظهر باللون الفعلي لليزر في الصورة).يمكنك بعد ذلك استخدام بسيط العمليات المورفولوجية, ، (من المحتمل إغلاق يكفي) لملء هذه الدوائر.

نصائح أخرى

دعك نقول أنك تستخدم ليزرًا لأحد هذه الألوان: أحمر ، أخضر ، أزرق. إذا كانت نقطة الليزر تبدو مشرقة للغاية (على الأقل في قناة واحدة ، على سبيل المثال ، الأحمر) ، فما عليك سوى وضع الصورة/القناة على ، على سبيل المثال ، سيتركك Greyvalue 200 ، مع عدد قليل من المرشحين لضوء الليزر. إذا كانت القنوات الأخرى مظلمة (ER) في هذه المنطقة ، فأنت تعلم أنه ضوء ساطع من اللون الصحيح. القليل من التصفية حسب الحجم ، ولديك فرصة جيدة للعثور على المكان.

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

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

cv::cvtColor(src, hsv, COLOR_BGR2HSV);

مزيد من المعلومات حول ويكيبيديا.

ثم لديك ثلاث قنوات: Hue (= اللون) ، والتشبع والخفة (أو القيمة).

مع cv::inRange(hsv, cv::Scalar(159, 135, 165), cv::Scalar(179, 255, 200), inRange); يمكنك الآن إنشاء صورة بالأبيض والأسود ، والتي توضح البكسلات في نطاق الألوان. القياس هي القيم المنخفضة والعالية لكل قناة.

في هذا المثال ، ستحصل على وحدات البكسل بلون بين 159 و 179 (Hue) ، والتشبع بين 135 و 255 والقيمة بين 165 و 200.

ربما هذا يمكن أن يحسن تتبعك.

ماذا عن هذا الرمز

https://www.youtube.com/watch؟v=MKUWNZ_OBQQ

https://github.com/niitsuma/detect_laser_pointer

في هذا الرمز ، تتم مقارنة لون HSV المرصود باللون المسجل باستخدام Hotelling's T Square Test

جرب القالب. أولاً ، "توجه المؤشر" إلى مكان معين حتى يمكن القيام بالمعبد. ثم أنت فقط تبحث عن ذلك.

أو ، كما قال Jilles de Wit ، يمكنك أن تأخذ فرق الإطارين الأخيرين ، وربما يظهر لك الفرق المؤشر.

قم بتحويل آخر 2 إطارين Do Gray Scale ، ثم قم بتطبيق الوظيفة الفرعية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top