- сдано после 3 подачи

Автор: Хао Чжуан, 2018 г.

Цели / шаги этого проекта следующие:

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

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

Демо

Демо (отладка)

использование

docker run -it --rm -p 8888:8888 -v `pwd`:/src udacity/carnd-term1-starter-kit

Калибровка камеры

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

Код для этого шага содержится в первой ячейке кода записной книжки IPython, расположенной в «./advanced_lane_detection.ipynb».

Я начинаю с подготовки «точек объекта», которые будут координатами (x, y, z) углов шахматной доски в мире. Здесь я предполагаю, что шахматная доска закреплена на плоскости (x, y) в точке z = 0, так что точки объекта одинаковы для каждого калибровочного изображения. Таким образом, objp - это просто реплицированный массив координат, и к objpoints будет добавляться его копия каждый раз, когда я успешно обнаруживаю все углы шахматной доски на тестовом изображении. К imgpoints будет добавлено положение в пикселях (x, y) каждого из углов в плоскости изображения при каждом успешном обнаружении шахматной доски.

Затем я использовал выходные данные objpoints и imgpoints для вычисления калибровки камеры и коэффициентов искажения с помощью функции cv2.calibrateCamera(). Я применил эту коррекцию искажения к тестовому изображению с помощью функции cv2.undistort() и получил следующий результат:

Трубопровод

1. Приведите пример изображения с исправленными искажениями.

Чтобы продемонстрировать этот шаг, я опишу, как я применяю коррекцию искажения к одному из тестовых изображений, подобных этому:

2. Опишите, как (и определите, где в вашем коде) вы использовали преобразования цвета, градиенты или другие методы для создания двоичного изображения с пороговыми значениями. Приведите пример результата двоичного изображения.

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

Тест 1

Тест 2

Тест 3

3. Опишите, как (и определите, где в вашем коде) вы выполнили перспективное преобразование, и предоставьте пример преобразованного изображения.

Код для моего преобразования перспективы включает функцию с именем transform_image_warp. Функция принимает в качестве входных данных изображение (img), а также исходную (src) и конечную (dst) точки. Я жестко выбрал исходную и конечную точки следующим образом:

src = np.float32(
    [[(img_size[0] / 2) - 55, img_size[1] / 2 + 100],
    [((img_size[0] / 6) - 10), img_size[1]],
    [(img_size[0] * 5 / 6) + 60, img_size[1]],
    [(img_size[0] / 2 + 55), img_size[1] / 2 + 100]])
dst = np.float32(
    [[(img_size[0] / 4), 0],
    [(img_size[0] / 4), img_size[1]],
    [(img_size[0] * 3 / 4), img_size[1]],
    [(img_size[0] * 3 / 4), 0]])

Это привело к появлению следующих точек отправления и назначения:

Источник Назначение585, 460320, 0203, 720320, 7201127, 720960, 720695, 460960, 0

Я проверил, что мое перспективное преобразование работает должным образом, нарисовав точки src и dst на тестовом изображении и его деформированном аналоге, чтобы убедиться, что линии выглядят параллельными на деформированном изображении.

4. Опишите, как (и определите, где в вашем коде) вы определили пиксели линии полосы движения и сопоставили их положение с помощью полинома?

Затем я подгоняю свои полосы движения полиномом 2-го порядка.

5. Опишите, как (и укажите, где в вашем коде) вы рассчитали радиус кривизны полосы движения и положение транспортного средства по отношению к центру.

Я сделал это в том же скрипте записной книжки в функции radius_curvature_center(), используя формулу из лекции Udacity.

Rcurve = (1+ (2Ay + B) ²) ^ (3/2) / | 2A |

где x = f (y) = Ay² + By + C - вторая полиномиальная кривая

6. Предоставьте пример изображения вашего результата, нанесенного на дорогу, чтобы зона полосы была четко обозначена.

Я реализовал этот шаг в том же скрипте записной книжки в функции locating_lanes(). Вот пример моего результата на тестовом изображении:

Трубопровод (видео)

Предоставьте ссылку на ваш окончательный видеовыход. Ваш конвейер должен работать достаточно хорошо на всем видео проекта (шаткие линии - это нормально, но никаких катастрофических сбоев, которые заставили бы машину съехать с дороги!).

Отметьте ссылку на мой результат видео.

Обсуждение

Кратко обсудите любые проблемы / вопросы, с которыми вы столкнулись при реализации этого проекта. Где ваш конвейер, скорее всего, выйдет из строя? Что вы можете сделать, чтобы сделать его более надежным?

Я использовал исторические изображения, чтобы сгладить обнаружение полосы движения, чтобы максимально уменьшить дрожание во время обнаружения полосы движения. Это делается в функции find_lanes(), где я поддерживаю два массива для левой и правой полос. Среднее из них будет использоваться для сглаживания линии полосы движения при обнаружении плохой полосы движения. Таким образом, это может помешать небольшому смещению с полосами движения, потому что полосы на раме плохо подогнаны.

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

Рассмотрение 3-го представления.

Соответствует спецификациям

Отличная работа, вы справились!

Я вижу, что вы вложили много усилий в свой проект и много продвинулись вперед, вы должны действительно гордиться!

Вы продемонстрировали твердое понимание представленных здесь концепций и готовы приступить к работе.

Если вам интересно, посмотрите мой взгляд на этот проект здесь.

Продолжайте и удачи!
Пол

PS. Если у вас есть дополнительные вопросы, помните, что вы можете найти меня в Slack под именем @viadanna

Запись / README

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

Требуемый отчет о рецензировании присутствует.

Калибровка камеры

Функции OpenCV или другие методы использовались для расчета правильной матрицы камеры и коэффициентов искажения с использованием изображений калибровочной шахматной доски, предоставленных в репозитории (обратите внимание, что это изображения шахматной доски 9x6, в отличие от изображений 8x6, используемых в уроке). Матрицу искажения следует использовать для устранения искажений одного из калибровочных изображений, представленных в качестве демонстрации правильности калибровки. Пример неискаженного калибровочного изображения включен в запись (или сохранен в папке).

Отличная работа с использованием cv2.findChessboardCorners и cv2.calibrateCamera для определения матрицы камеры и коэффициентов искажения.

Конвейер (тестовые изображения)

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

Хорошая работа с cv2.undistort для применения калибровки камеры.

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

Потрясающий

Отличная работа по изучению пороговых значений цвета и градиента для построения двоичного изображения.

Предположение

Помните, что идея здесь состоит в том, чтобы пиксели дорожек преобладали в искаженном двоичном файле.

Например, H-канал в HLS остается довольно постоянным при изменении яркости, что может помочь в более сложных видео. Прочтите этот урок для получения дополнительной информации.

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

Хорошая работа - использовать cv2.getPerspectiveTransform для преобразования каждого изображения в вид с высоты птичьего полета, а также получить обратное преобразование для последующего преобразования найденных линий.

Потрясающий

Тестирование деформации на прямом участке дороги - отличная идея, поскольку вы поймете, что это правильно, если проекция показывает параллельные полосы движения. Это важно для получения точных показаний кривизны.

Предположение

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

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

Хорошая работа по поиску линий переулка и полиномиальных коэффициентов.

Потрясающий

Отличная идея кэширования полос, чтобы сделать поиск более эффективным, сгладить результаты и выполнить проверку работоспособности.

Здесь идея состоит в том, чтобы измерить, где проходят линии полосы движения, и оценить, насколько дорога изгибается и где находится транспортное средство по отношению к центру полосы. Радиус кривизны может быть указан в метрах, если изгиб дороги следует по окружности. Что касается положения автомобиля, вы можете предположить, что камера установлена ​​в центре автомобиля, и отклонение средней точки полосы движения от центра изображения является смещением, которое вы ищете. Как и в случае с полиномиальной аппроксимацией, конвертируйте пиксели в метры.

Хорошая реализация методики расчета радиуса кривизны и положения автомобиля.

Предположение

Кривизну также можно использовать для проверки работоспособности, поскольку обе полосы должны быть примерно одинаковыми, то есть:

sanity = 2 > left_curverad / right_curverad > 0.5

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

lane_width = right_fitx[-1] - left_fitx[-1]
xm_per_pix = 3.7 / lane_width

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

Потрясающий

Ваш конвейер довольно хорошо определяет полосы на тестовых изображениях, показывая полосы точно в цель.

Трубопровод (видео)

Конвейер обработки изображений, который был установлен для поиска линий полос на изображениях, успешно обрабатывает видео. Результатом здесь должно быть новое видео, в котором полосы движения идентифицируются в каждом кадре, а выходные данные генерируются относительно радиуса кривизны полосы движения и положения транспортного средства в полосе движения. Трубопровод должен правильно отображать изогнутые линии и не выходить из строя при появлении теней или изменения цвета дорожного покрытия. Выходное видео должно быть связано с описанием и / или сохранено и отправлено вместе с проектом.

Потрясающий

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

Обсуждение

Обсуждение включает в себя некоторое рассмотрение проблем / возникших проблем, того, что можно улучшить в их алгоритме / конвейере, и какие гипотетические случаи могут привести к сбою их конвейера.

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

Обзор заявки 2:

Требуются изменения

2 ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ ТРЕБУЮТ ИЗМЕНЕНИЙ

Отличная работа. Вы проделали отличную работу, и ваш код требует лишь нескольких улучшений, чтобы соответствовать всем требованиям.
Давайте сделаем этот проект идеальным и представим его будущим читателям и потенциальным работодателям. Так держать !!!
Удачи :)

Запись / README

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

Шаги, предпринятые для завершения проекта, объясняются в описании со ссылками на то, где в коде был реализован каждый элемент рубрики. Хорошая работа по выявлению проблем в вашем конвейере и предложениям по их улучшению.

Калибровка камеры

Функции OpenCV или другие методы использовались для расчета правильной матрицы камеры и коэффициентов искажения с использованием изображений калибровочной шахматной доски, предоставленных в репозитории (обратите внимание, что это изображения шахматной доски 9x6, в отличие от изображений 8x6, используемых в уроке). Матрицу искажения следует использовать для устранения искажений одного из калибровочных изображений, представленных в качестве демонстрации правильности калибровки. Пример неискаженного калибровочного изображения включен в запись (или сохранен в папке).

Потрясающий

  • Изображения шахматной доски использовались для расчета калибровочной матрицы камеры и коэффициентов искажения.
  • Углы шахматной доски находятся с помощью cv2.findChessboardCorners
  • Матрица камеры и коэффициенты искажения рассчитываются с использованием cv2.calibrateCamera.
  • Хорошая работа для демонстрации неискажения на одном из калибровочных изображений.
  • Молодцы, что поделились изображением в рецензии.

Конвейер (тестовые изображения)

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

Потрясающий

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

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

Потрясающий

  • Хорошая работа по применению комбинации пороговых значений цвета и градиента для создания двоичного изображения с четко видимыми линиями полос движения.
  • Молодцы, что поделился двоичным изображением в описании.

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

Потрясающий

  • Были выбраны соответствующие координаты источника и пункта назначения, чтобы изображение выглядело с высоты птичьего полета с параллельными линиями полос движения.
  • Хорошая работа с cv2.getPerspectiveTransform() для вычисления матрицы перспективного преобразования.
  • Хорошо сделано, используя cv2.warpPerspective() in, чтобы преобразовать двоичное изображение в "вид с высоты птичьего полета".
  • Спасибо, что поделились выходным изображением, чтобы показать результаты.

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

Потрясающий

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

Здесь идея состоит в том, чтобы измерить, где проходят линии полосы движения, и оценить, насколько дорога изгибается и где находится транспортное средство по отношению к центру полосы. Радиус кривизны может быть указан в метрах, если изгиб дороги следует по окружности. Что касается положения автомобиля, вы можете предположить, что камера установлена ​​в центре автомобиля, и отклонение средней точки полосы движения от центра изображения является смещением, которое вы ищете. Как и в случае с полиномиальной аппроксимацией, конвертируйте пиксели в метры.

необходимые

  • Неправильное положение автомобиля относительно центра. Поскольку ширина полосы движения составляет около 3,7 метра, а центр полосы будет примерно 3,7 / 2 = 1,85. При высоких значениях, превышающих 1 метр, автомобиль должен выезжать за пределы полосы движения, но на видео это не так. После правильного определения полосы движения убедитесь, что значение положения автомобиля относительно центра находится в диапазоне (-0,5,0,5). Мы должны использовать обнаруженные точки полосы движения, ближайшие к машине. Подробнее об этом можно прочитать здесь: https://discussions.udacity.com/t/where-is-the-vehicle-in-relation-to-the-center-of-the-road/237424/8
  • Выходное видео показывает, что автомобиль движется вправо от центра на большей части видео, однако на самом деле автомобиль движется слева от центра. Поскольку мы вычисляем положение автомобиля по отношению к центру полос, центр полосы следует вычесть из центра изображения (автомобиля).
  • Кроме того, в настоящее время значения радиуса кривизны статичны для нескольких кадров, это связано с использованием информации о старых полосах движения. Вы можете попробовать предлагаемые ниже пороговые значения, чтобы увидеть, можно ли уменьшить зависимость от старых кадров. В идеале эти значения должны обновляться для каждого кадра.

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

Потрясающий

Хорошая работа: преобразование полосы движения обратно в пространство исходного изображения и объединение его с исходным изображением

Трубопровод (видео)

Конвейер обработки изображений, который был установлен для поиска линий полос на изображениях, успешно обрабатывает видео. Результатом здесь должно быть новое видео, в котором полосы движения идентифицируются в каждом кадре, а выходные данные генерируются относительно радиуса кривизны полосы движения и положения транспортного средства в полосе движения. Трубопровод должен правильно отображать изогнутые линии и не выходить из строя при появлении теней или изменения цвета дорожного покрытия. Выходное видео должно быть связано с описанием и / или сохранено и отправлено вместе с проектом.

необходимые

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

Скриншоты

Предложения / Чтения

  • Для этого видео и видео с заданием я предлагаю попробовать следовать пороговым значениям, так как сами по себе эти значения работают.
  • def select_yellow(image): hsv = cv2.cvtColor(image, cv2.COLOR_RGB2HSV) lower = np.array([20,60,60]) upper = np.array([38,174, 250]) mask = cv2.inRange(hsv, lower, upper) return mask
  • и
  • def select_white(image): lower = np.array([202,202,202]) upper = np.array([255,255,255]) mask = cv2.inRange(image, lower, upper) return mask
  • и
  • def comb_thresh(image): yellow = select_yellow(image) white = select_white(image) combined_binary = np.zeros_like(yellow) combined_binary[(yellow >= 1) | (white >= 1)] = 1 return combined_binary
  • Помимо настройки реализованных алгоритмов (экспериментирование с измерениями достоверности), вы можете прочитать о других реализациях: Прочитать 1 и Прочитать 2

Обсуждение

Обсуждение включает в себя некоторое рассмотрение проблем / возникших проблем, того, что можно улучшить в их алгоритме / конвейере, и какие гипотетические случаи могут привести к сбою их конвейера.

Потрясающий

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

Обзор подачи 1

Требуются изменения

2 ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ ТРЕБУЮТ ИЗМЕНЕНИЙ

Хорошее начало вашего проекта. Я включил несколько предложений о том, как улучшить оборудованные полосы движения. Если вы столкнетесь с другими проблемами при включении этих предложений, пожалуйста, не стесняйтесь связаться со своим назначенным наставником, чтобы получить некоторую помощь в этом проекте. Удачи с вашей следующей работой!

Запись / README

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

Калибровка камеры

Функции OpenCV или другие методы использовались для расчета правильной матрицы камеры и коэффициентов искажения с использованием изображений калибровочной шахматной доски, предоставленных в репозитории (обратите внимание, что это изображения шахматной доски 9x6, в отличие от изображений 8x6, используемых в уроке). Матрицу искажения следует использовать для устранения искажений одного из калибровочных изображений, представленных в качестве демонстрации правильности калибровки. Пример неискаженного калибровочного изображения включен в запись (или сохранен в папке).

Матрица камеры и коэффициенты искажения были рассчитаны правильно и откалиброваны с использованием изображений шахматной доски из репозитория.

Конвейер (тестовые изображения)

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

Коррекция искажений применена правильно, и пример включен в заявку.

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

Отличная работа с использованием комбинации методов для создания двоичного изображения, содержащего вероятные пиксели полосы движения.

Вот трюк, которому я научился во время работы над этим проектом; это может быть полезно для будущих подобных проектов:

Вместо того, чтобы пробовать переменные и повторно запускать блоки кода, можно вместо этого создавать интерактивные виджеты в Jupyter Notebook, которые позволяют быстро обновлять параметры. Этот трюк позволил мне найти оптимальные параметры для большинства кадров.

Вот как могут выглядеть виджеты:

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

Чтобы узнать больше об этом инструменте, загляните в этот репозиторий.

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

«Вид с высоты птичьего полета» создан правильно.

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

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

Здесь идея состоит в том, чтобы измерить, где проходят линии полосы движения, и оценить, насколько дорога изгибается и где находится транспортное средство по отношению к центру полосы. Радиус кривизны может быть указан в метрах, если изгиб дороги следует по окружности. Что касается положения автомобиля, вы можете предположить, что камера установлена ​​в центре автомобиля, и отклонение средней точки полосы движения от центра изображения является смещением, которое вы ищете. Как и в случае с полиномиальной аппроксимацией, конвертируйте пиксели в метры.

Расчет положения автомобиля относительно центра полосы кажется немного неправильным:

На протяжении всего кадра мы не должны видеть расстояние до центра более 0,5 метра. Одно быстрое исправление, которое можно сделать здесь, - это обновить переменную xm_per_pix, чтобы она соответствовала изображению. Например, на приведенном выше изображении ширина полосы движения кажется больше 900 пикселей, поэтому это необходимо отразить в переменной xm_per_pix. Немного более надежный метод - это вычисление ширины в пикселях левой и правой полиномиальных линий и использование этого числа для этой переменной.

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

Результаты подгонки были правильно деформированы и нанесены поверх исходного изображения.

Трубопровод (видео)

Конвейер обработки изображений, который был установлен для поиска линий полос на изображениях, успешно обрабатывает видео. Результатом здесь должно быть новое видео, в котором полосы движения идентифицируются в каждом кадре, а выходные данные генерируются относительно радиуса кривизны полосы движения и положения транспортного средства в полосе движения. Трубопровод должен правильно отображать изогнутые линии и не выходить из строя при появлении теней или изменения цвета дорожного покрытия. Выходное видео должно быть связано с описанием и / или сохранено и отправлено вместе с проектом.

Подгонка дорожек в большинстве случаев проходит нормально, но есть пара проблемных рам, которые я бы хотел, чтобы вы исправили:

Во-первых, иногда расчетная полоса не совпадает с реальной полосой движения:

Я заметил, что вы создали функцию «проверки работоспособности» is_good_lane. Это хорошее начало. Убедитесь, что он делает следующее:

  1. Есть ли правильное расстояние между двумя многочленами? Мы знаем, что ширина дороги составляет около 3,7 метра, а это значит, что расстояние должно быть примерно этого значения.
  2. Помните, что вы рассчитали радиус кривизны. Посмотрите, имеют ли два многочлена приемлемо схожую кривизну.
  3. Сравните эти два значения выше с предыдущими кадрами. Если они значительно отклонились, вполне вероятно, что в новом обнаружении могут быть ошибки.

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

Кроме того, в моем собственном проекте я нашел действительно полезным включение обработанного двоичного изображения в видео следующим образом:

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

Вторая проблема - это неправильное расстояние от центра, о чем я упоминал выше. В нескольких кадрах он достигает расстояния более 1 метра!

Обсуждение

Обсуждение включает в себя некоторое рассмотрение проблем / возникших проблем, того, что можно улучшить в их алгоритме / конвейере, и какие гипотетические случаи могут привести к сбою их конвейера.

Очень хорошее обсуждение. Похоже, вы сможете реализовать некоторые из предложений, которые вы включили в свое обсуждение.