e
Контроль полосы движения — одна из наиболее приоритетных задач систем помощи водителю и автономных автомобилей. Они следят за движением машины по выбранному маршруту и предупреждают о возможном съезде с заданного пути. В этой статье мы представим простой метод распознавания дорожной разметки с помощью Python и OpenCV.
Чтобы распознать полосы разметки необходимо:
Это поможет увеличить контраст разметки по отношению к дороге, чтобы потом было легче выделить жёлтые и белые полосы.
Затемнение выполняется, чтобы уменьшить контраст обесцвеченных участков дороги.
Исходные RGB-изображения переводятся в пространство HLS. По сравнению с HSV (Hue, Saturation, Value — тон, насыщенность, значение), HLS помогает получить лучший цветовой контраст разметки и дороги. Впоследствии это поможет выделить нужные цвета для определения полос движения.
Здесь мы используем операцию inRange из OpenCV, чтобы получить нужную маску в выбранном пороговом диапазоне. Методом подбора можно найти наиболее подходящие значения.
Для жёлтой маски:
— Использовались значения оттенка между 10 и 40.
— Установлена более высокая насыщенность (100–255), чтобы отфильтровать жёлтый цвет земли и холмов.
Для белой маски:
— Установлено более высокое значение яркости (200–255).
После этого мы выполняем операцию побитового «ИЛИ» обеих масок, чтобы скомбинировать их.
На снимках ниже показан результат побитового «И» между комбинированной маской и затемнённым изображением.
Размытие (или сглаживание) по Гауссу — это этап предварительной обработки для уменьшения шума. Мы удаляем лишние края на изображении и оставляем только наиболее заметные.
Для размытия с помощью GaussianBlur из OpenCV необходимо указать размер ядра (нечётное значение). Испробовав несколько вариантов, мы выбрали 7.
Теперь к размытым снимкам применяется детектор Canny. Canny Edge Detection — алгоритм, который обнаруживает края на основе изменения градиента. Хотя первым его шагом по умолчанию является сглаживание изображения с размером ядра 5, мы всё равно используем явное размытие по Гауссу на предыдущем этапе. Другие шаги детектора включают в себя:
— нахождение градиента интенсивности изображения;
— подавление максимумов;
— пороговый гистерезис.
Даже после детектора Canny на снимках остаётся много лишних линий и краёв, не являющихся разметкой. Область интереса — это многоугольник, охватывающий наиболее полезную для нас часть изображения.
Обратите внимание, что координата [0, 0] находится в левом верхнем углу, номера строк увеличиваются сверху вниз, а столбцов — слева направо.
Предполагается, что камера остаётся неподвижной, а полосы — ровными, поэтому мы можем «угадать» интересующую область.
Преобразование Хафа — способ извлечения линии из изображения. Это можно сделать, представив линии в виде параметризованных точек, а точки — в виде линий/синусоид (в зависимости от декартовой/полярной систем координат). Если несколько линий или синусоид пересекаются друг с другом в одной точке, мы можем сделать вывод, что они относятся к одной линии на изображении.
После обнаружения линий Хафа в области интереса мы отрисовываем их на оригинальных снимках.
На предыдущем изображении видно, что разметка отобразилась не полностью. Нам хотелось бы её дополнить. Для этого сначала нужно определить левую и правую полосу:
— левая полоса: если мы увеличим координаты столбцов, то координаты строк уменьшатся (отрицательный градиент)
— правая полоса: если увеличить координаты столбцов, координаты строк тоже увеличатся (положительный градиент)
— будем игнорировать вертикальные линии.
После определения левой и правой полос мы экстраполируем их:
Теперь давайте протестируем наш алгоритм на записи с видеорегистратора.
Он неплохо работает для прямых полос разметки:
Но не очень хорошо справляется с искривлениями:
— Обнаружение прямых линий Хафа не очень хорошо работает для изогнутой дороги/полосы.
— Параметры устанавливаются методом подбора. Область интереса предполагает, что камера остаётся неподвижной, а полосы — ровными. Таким образом, для определения вершин многоугольника требуется либо «угадывание», либо хардкодинг.
— На дорогах без разметки алгоритм не будет работать.
— Вместо прямых линий лучше использовать более сложную кривую, что будет полезным на изогнутых участках дороги.
— Даже имея в наличии информацию из предыдущих кадров, усреднять её — не всегда хорошая стратегия. Лучше использовать средневзвешенные или приоритетные значения.
Исходный код доступен на GitHub. В проекте доступны два каталога: CarND-LaneLines-Р1 и CarND-Advanced-Lane-Lines. В первом находится проект конвейера, описанного в этой статье (скрипт P1.ipynb). Второй каталог предлагает улучшенный вариант алгоритма, в котором используется калибровка камеры и обнаружение кривых линий разметки. Вы можете протестировать один из них (или оба), используя свои варианты настройки параметров, и предложить улучшения.
Делитесь своими предложениями и результатами, задавайте вопросы в комментариях, если что-то показалось непонятным.
С оригинальной статьёй можно ознакомиться на портале towardsdatascience.com.
Многие предприниматели жалуются на сложный и слишком изобильный документооборот: много документов приходится оформлять. Но при…
Чтобы легально пользоваться результатами чужого труда в своем бизнесе, нужно за это заплатить. И неважно,…
Франшизы предоставляют предпринимателям возможность использовать популярные бренды, эффективные бизнес-модели и поддержку со стороны материнской компании.…
Некоторые компании сосредотачивают в своих руках и производственные мощности, и права на то, что на…
У любой компании есть адрес, по которому она «прописана», то есть зарегистрирована в ЕГРЮЛ. Но…
Подросток может заниматься бизнесом, но с учетом важных условий, прописанных в законе. Разбираемся, как несовершеннолетнему…