Тем не менее, в рамках первого семестра моей программы Udacity Self-Driving Car многие темы, касающиеся компьютерного зрения и того, как они интегрируются в вождение автомобиля, включали множество проектов, которые можно встретить в реальных попытках программирования автономного автомобиля.

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

Некоторые задействованные техники:

  • Калибровка и преобразование изображения
  • Пороговое значение изображения с помощью градиентов
  • Регрессия для отслеживания кривизны полосы движения

Калибровка и трансформация перспективы

Объектив каждого объектива увеличивает небольшую долю искажений на изображениях, которые он захватывает, особенно по углам. Используя распечатанное изображение шахматной доски, а затем отслеживая углы с помощью функции OpenCV, изображение можно немного преобразовать, чтобы выровнять линии, а затем применить это преобразование к последующим изображениям с камеры. Ниже приведен пример устранения искажений изображения:

Далее мне нужно преобразовать изображение с точки зрения водителя на точку зрения с высоты птичьего полета. Этого можно добиться с помощью функции OpenCV warpPerspective.

Двоичное преобразование для явной идентификации полосы движения

Я выполнил преобразование цветовых каналов в HLS, а затем вытащил слой S, так как он, казалось, лучше всего выделял линию дорожки. Затем с помощью порогов градиента сгенерируйте бинарное изображение (значения равны 0 или 255). Пороговые значения, которые я использовал, были 10 и 100. Ниже приведен пример моих результатов для этого шага.

Постройте гистограмму значений пикселей

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

Обнаружение скользящего окна

Разбивая изображение по высоте на ряд скользящих окон, я могу постоянно находить местоположения пикселей и начинать отмечать местоположения дорожек. На изображении ниже вы можете увидеть результат этих усилий. Хотя были некоторые проблемы с рисованием прямоугольников окна, на практике он работал достаточно хорошо. Он использует в общей сложности 9 окон на каждой дорожке, чтобы затем отслеживать концентрацию пикселей в средней точке, чтобы наилучшим образом соответствовать линии дорожки.

Наложение полигона для заполнения дорожек

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

Заключительные шаги

Теперь я просто беру построенную дорожку обратно в видеопоток с обнаруженными кривыми линий дорожки, также наложенными на изображение, вместе с кривыми, напечатанными в верхнем левом углу (радиус в метрах).