Pull to refresh

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

Image processing
Здраствуйте, решил поделиться своим опытом применения 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 и знания в области распознавания видео. Аналогов данной библотеки не нашел.

з.ы. ночью данный подход тоже вполне применим, с некоторыми вариациями.
Tags:opencvroad sign recognitionраспознавание изображений
Hubs: Image processing
Total votes 41: ↑40 and ↓1 +39
Views42.6K

Comments 18

Only those users with full accounts are able to leave comments. Log in, please.

Popular right now

Top of the last 24 hours