Беспилотным автомобилям нужны глаза, чтобы видеть и воспринимать мир. В отличие от людей, они могут видеть только с помощью встроенных камер, но не обязательно понимают, что происходит вокруг них. Следовательно, нам нужно вооружить их этими навыками. Например, если самоуправляемый автомобиль находится на дороге, ему необходимо знать, на какой полосе он находится, насколько изогнута полоса и насколько он расположен в центре дороги. В этом посте я объясню, как определить линии дорожек на изображении, а затем применить тот же алгоритм к видеопотоку.

1) Калибровка и устранение искажений изображения с камеры

Во-первых, мы не искажаем изображения с камеры, поскольку преобразование не идеально, когда камера смотрит на 3D-объекты в мире и преобразует их в 2D-изображения. В математике это преобразование из трехмерных точек объекта, P X, Y и Z, в точки двумерного изображения, P только x и y выполняется с помощью матрицы преобразования, называемой матрицей камеры, C. На рисунке ниже используются точечные отверстия, как на рисунке 1, но в реальных камерах используются линзы для одновременной фокусировки нескольких световых лучей, что позволяет им быстро формировать изображения.

При использовании линз возникают новые искажения. Это радиальные искажения, когда линии или объекты кажутся более или менее искривленными, чем они есть на самом деле. Существуют также тангенциальные искажения, когда объектив камеры не выровнен идеально параллельно плоскости изображения, в которой находится пленка или матрица камеры, что делает изображение наклонным.

Мы получим коэффициенты искажения, используя функцию калибровки камеры OpenCV, и откалибруем изображения по этим значениям. Но как нам получить эти значения? Один из способов — использовать изображения известных фигур, например, шахматную доску. Почему шахматная? Шахматная доска отлично подходит для калибровки, потому что ее регулярный высококонтрастный рисунок позволяет легко обнаруживать ее автоматически.

Мы используем значения искажения для создания преобразования, которое сопоставляет эти искаженные точки с неискаженными точками с помощью Python и OpenCV.

Затем мы выполняем преобразование перспективы, как показано на рис. 5. Мы используем преобразование перспективы для измерения кривизны линий, и для этого нам нужно преобразовать изображение в вид сверху вниз.

2) Градиенты изображений

Следующие шаги, мы хотим обнаружить результаты переулка. Градиенты используются для обнаружения крутых изображений, и если мы возьмем градиент в направлении x, мы отдадим приоритет краям, которые ближе по вертикали, и, альтернативно, мы отдадим приоритет градиенту в направлении y, если мы возьмем градиент в направлении y. Пример показан на рисунке 6.

Мы также можем использовать различные интерпретации значений Собеля, таких как их величина и направление. Величина градиента представляет собой квадратный корень из квадратов отдельных градиентов x и y. Направление градиента — это просто арктангенс (арктангенс) градиента y, деленный на градиент x.

Затем мы можем смешивать и подбирать комбинации функций Собеля, пробовать разные пороги и выбирать наиболее эффективные значения, которые выделяют линии.

3) Цветовые пространства

Мы не должны ограничиваться только изображениями в градациях серого, а пробовать разные цветовые пространства, чтобы получить лучшее представление изображения. Например, используя цветовое пространство HLS, выбрав канал S и получив градиенты в направлениях X, мы получим изображение, как показано на рисунке 7.

4) Установите полином на линию дорожки

После того, как мы выполнили шаги 1–3, нам нужно найти способ подогнать линию к дорожкам. Сложность в том, что эти линии изгибаются, поэтому мы используем многочлен. Один из способов подгонки линии — найти пики на гистограмме и использовать скользящее окно для пиков. Эти пики будут хорошими индикаторами положения дорожек. Окончательный результат этих шагов показан на рисунке 8. Преимущества этого метода заключаются в том, что когда мы знаем, где находятся линии, нам не нужно продолжать поиск в скользящем окне.

Наконец, мы получим результаты, как показано ниже, при реализации метода в видеопотоке.

В следующем посте я расскажу о том, как вместо этого обнаруживать транспортные средства.

Отказ от ответственности. Большинство публикуемых изображений взяты из курса Udacity's Self Driving Car Engineering Nanodegree. Я также пропустил много шагов, чтобы сделать этот пост удобным для чтения. Напишите мне, если хотите узнать больше о проекте.