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