7

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

Спасибо!

+0

Можно ли использовать какой-то фильтр перед веб-камерой, если да, какие фильтры? – Keshan

+0

Это факт, что источник света - это действительно важный для вас лазер, или вы просто используете его, потому что это удобный способ сделать яркую точку? То есть, есть ли у вас причины заботиться о том, что источник является монохроматическим и соответствует фазе? Если да, то каковы оптические свойства поверхности, на которой проецируется точка (плоскостность и т. Д.)? – dmckee

+0

Можете ли вы просто отсканировать изображение для небольшой области с красным компонентом, заметно усиленным по сравнению с соседней областью? – Dialecticus

ответ

7

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

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

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

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

+0

Думаю, мне лучше попробовать первые два варианта, и кажется, что это возможно :). Большое спасибо. – Keshan

4

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

+0

спасибо за ответ У меня есть стена, и она проецируется так, когда я просматриваю изображение и искал красный канал, иногда красный цвет на проецируемой поверхности может вызвать некоторые проблемы. – Keshan

3

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

0

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

Или, как сказал jilles de wit, вы можете различить последние 2 кадра, возможно, разница покажет вам указатель.

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

1

Как было предложено в других ответах, поиск цвета может быть хорошей идеей. Вы должны рассмотреть возможность поиска определенного цветового диапазона. Лучший способ сделать это - преобразовать изображение в цветовое пространство 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.

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

Смежные вопросы