Обнаружение лазерного света с OpenCV и C ++ - PullRequest
7 голосов
/ 24 октября 2010

Я хочу отследить точку лазерного излучения (которая находится на стене) с помощью веб-камеры, и я использую openCV для выполнения этой задачи.Кто-нибудь может предложить мне способ сделать это с C ++.

Спасибо!

Ответы [ 6 ]

8 голосов
/ 25 октября 2010

У вас есть три варианта в зависимости от стабильности вашего фона и того, что вы хотите сделать с изображением.

Вы можете сделать свое изображение настолько темным, что вы можете видеть только лазерточка.Вы можете сделать это, закрыв диафрагму и / или уменьшив время затвора.Даже с дешевыми веб-камерами это обычно можно сделать в драйвере.Как только вы это сделаете, найти лазерную точку очень легко.Вы делаете изображение максимально темным, потому что обычно точка, в которой светит лазер, слишком яркая, чтобы камера могла ее уловить.Это означает (как вы уже видели), что вы не можете различить световую лазерную точку и другие световые объекты на изображении.Сделав его темнее, вы теперь можете сделать это.

Если у вас есть другое использование вашего изображения (показ его людям) и ваш фон стабилен, вы также можете использовать среднее из последних нескольких видеоизображений как "background ", а затем найдите место, где есть большая разница между этим фоном и самым новым изображением.Обычно на это указывает лазер (опять же, если ваш фон достаточно стабилен).

Наконец, если ваш фон нестабилен и вы не хотите, чтобы изображение было слишком темным, ваш последний вариант -ищите все пиксели, которые являются очень яркими и более яркими в красном канале, чем в зеленом и синем (если вы используете красный лазер).Эта система будет по-прежнему отвлекаться на белые пятна, но не так сильно, как просто нахождение ярких пикселей.Если центр пятна лазерного указателя действительно отображается ярко-белым независимо от цвета лазера, то этот метод позволит вам найти «кольца» вокруг этого яркого пятна (внешней части точки, где лазер не такой яркий, какон находится в центре, так что он отображается с фактическим цветом лазера на изображении).Затем вы можете использовать простые морфологические операции (вероятно, достаточно закрытие ), чтобы заполнить эти круги.

4 голосов
/ 25 октября 2010

Допустим, вы используете лазер одного из этих цветов: красный, зеленый, синий.Если лазерная точка выглядит очень яркой (по крайней мере, в одном канале, например, красном), то просто установив порог изображения / канала со значением, скажем, Greyvalue 200, у вас останется несколько кандидатов на лазерный луч.Если другие каналы в этой области темные, то вы знаете, что это яркий свет нужного цвета.Небольшая фильтрация по размеру, и у вас есть хороший шанс найти это место.

3 голосов
/ 25 октября 2010

Если вы прикрепите ИК-фильтр к своей веб-камере, ваша проекция не будет заснята, что значительно упростит обнаружение лазерной точки (с помощью простого вычитания фона и т. Д.). Предполагается, что лазерная указка излучает ИК-свет ...

1 голос
/ 25 мая 2014

Как насчет этого кода

https://www.youtube.com/watch?v=MKUWnz_obqQ

https://github.com/niitsuma/detect_laser_pointer

В этом коде наблюдаемый цвет ВПГ сравнивается с зарегистрированным цветом с использованием критерия Т-квадрата Хотеллинга

1 голос
/ 28 октября 2013

Как предлагается в других ответах, поиск цвета может быть хорошей идеей.Вы должны рассмотреть возможность поиска определенной цветовой гаммы.Лучший способ сделать это - преобразовать изображение в цветовое пространство HSL или HSV.

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

Подробнее о Wikipedia .

Тогда у вас есть три канала: оттенок(= цвет), насыщенность и яркость (или значение).

С помощью cv::inRange(hsv, cv::Scalar(159, 135, 165), cv::Scalar(179, 255, 200), inRange); теперь вы можете создавать черно-белое изображение, которое показывает, какие пиксели находятся в цветовом диапазоне.Скаляры - это низкие и высокие значения для каждого канала.

В этом примере вы получите пиксели с цветом от 159 до 179 (оттенок), насыщенностью от 135 до 255 и значением от 165 до 200.

Может быть, это может улучшить ваше отслеживание.

0 голосов
/ 01 февраля 2011

попробуйте шаблон Maching.сначала вы «указываете указатель» на определенное место, чтобы храм можно было сделать.Тогда вы просто ищите его.

Или, как сказал Джиллс де Вит, вы можете взять разницу последних 2 кадров, вероятно, разница покажет вам указатель.

Преобразование последнего2 кадра делают шкалу серого, затем применяют функцию SUB.

...