Распознавание дорожных знаков


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

Итак этапы решения задачи.

Первый этап — получение изображения с камеры. При разработке пользовалась сетевая камера, web камеры достаточно хорошего разрешения под рукой не было. OpenCV предоставляет довольно простой способ работы с web камерами. (модуль HighGui )

cvNamedWindow("web-cam", CV_WINDOW_AUTOSIZE); //создаем окно в котором будет показывать видео поток
 this->capture = cvCreateCameraCapture(0);
 cvSetCaptureProperty(this->capture,CV_CAP_PROP_FRAME_WIDTH_HEIGHT,640480); //устанавливаем разрешени 640x480

 while (1)
 {
 //для работы с веб камерой
 if(!cvGrabFrame(this->capture)) //берем кадр с камеры
 break;
 this->frame = cvRetrieveFrame(this->capture); //копируем кадр (используется формат IplImage)
 if(!frame)
 break;
 cvShowImage("web-cam",this->frame); //показываем кадр в заранее созданном окне

 cvWaitKey(10);
 if(this->fwork == false)
 break;
 }


С помощью приведенного выше кода получаем постоянно актуальные кадры с камеры


Второй этап — преобразовываем полученное изображение. На первом этапе мной было сделано распознавание только некоторых групп знаков. (Запрещающие, предупреждающие) В результате некоторых экспериментов был получен фильтр, после которого получаем следующей изображение.


Третий этап — применение порогового фильтра. OpenCV содержит ряд преобразований и обработок, я применил cvThreshold параметры для этого фильтра подбирались опытным путем.


Четвертый этап — определение границ контуров. Опять же придумать своего велосипеда с 3-мя колесами не пришлось, была взята хорошо оптимизированная функция из библиотеки cvCanny — детектор границ. Полученные контура обводятся на исходном изображении


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

Подобная схема работы позволила создать готовое приложение, способное за секунду обрабатывать где-то порядка 3-5 кадров (в зависимости от загруженности кадра). Для теста использовался ноутбук — Core 2 Duo T5450, сетевая камера с разрешением кажется 1024х768. При тестах система показала распознавание где-то 90% знаков, единственное НО. Система не сможет распознать знак, если он погнут, закрыт рекламным щитом и тому подобные вещи (что к сожалению встречается довольно часто. Тестировал почти на идеальном участке дороги).

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

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

И на последок видео

Оригинал статьи здесь
  • 0
  • avatar
  • Поделиться

Комментарии (10)

0
Я правильно понимаю, что распознавание происходит на довольно близком расстоянии из-за камеры с низким разрешением или замыленным объективом?
0
Все верно, если правильно настроить фокус, использовать камеру с более высоким разрешением и немного переделать алгоритм распознавания, то можно добиться гораздо лучших результатов
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.