Как стать автором
Поиск
Написать публикацию
Обновить

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

Время на прочтение2 мин
Количество просмотров47K
Здраствуйте, решил поделиться своим опытом применения OpenCV (Intel) при решении практической задачи.

Зачада стояла следущая — автоматическое распознавание дорожных знаков на видео желательно в режиме реального времени. К большому сожалению на русском языке очень мало информации по подобной проблеме, и еще меньше примеров.
Вообщем пошарив по интернету, было принято решение использовать библиотеку 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 и знания в области распознавания видео. Аналогов данной библотеки не нашел.

з.ы. ночью данный подход тоже вполне применим, с некоторыми вариациями.
Теги:
Хабы:
Всего голосов 41: ↑40 и ↓1+39
Комментарии18

Публикации

Ближайшие события