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

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

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

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 18

      0
      Распозняет толко что вот эта область на кадре — знак, ну и плюс по форме, к какой категории относится?
      А какое применение? Хотя если пофантазировать — такой софт на CarPC — едешь по трассе, при приближении к знаку раздается тихий писк и изображение знака показывается на небольшом экранчике, еще комп распознает что это скажем знак ограничения скорости и при превышении ее будет вас «ругать» =)

      или например для добавления POI всяческих знаков для навигатора
        0
        На новых мерседесах уже есть такая штука, дорожный знак распознается и выводится на электронное табло между спидометром и тахометром.
          +1
          да и на Opel insignia (кажется название правильно написал)
          применения на данный момент два (теоретических)
          1. ставится в машину что-то типа системы помощи уставшему водителю, который уже несколько часов за рулем. Проехал знак, но не успел заметить какой именно, глянул на экран.
          2. совместными усилиями можно составить (или дополнить) карту дорог со знаками

          з.ы. в Сибири ничего подобного я не видел… у нас и карт то по большому счету нет
          0
          Видимо что-то в этом духе: ST:TSR — Traffic Sign Recognition system )
          0
          Отлично! Спасибо большое за интересную информацию! А не могли бы вы поделиться информацией по поводу того, как в дальнейшем были использованы опознанные дорожные знаки? То есть ваша программа была сделана только ради вашего любопытства, либо есть ещё какой-то повод для её создания?
          • UFO just landed and posted this here
            +1
            Классно, спасибо!

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

            А этот фильтр нуждается в адаптации при изменении уровня освещения, контрастности и т. д.?
              0
              В этом фильтре ничего не меняется, он работае абсолютно одинаково при любых внешних условиях.
              Единственная величина которая меняется это 1 параметр функции cvThreshold там есть параметр обозначающий по сути по какому уровню отсекать. Под этот парамтр с помощью экспериментов была подобрана простая формула в зависимости от самой яркой точки.

              Остальные параметры не менялись, единственное что существенно влияет на распознавание и вообще на возможность подобной обработки — это настройки камеры.
              +1
              Хорошая разработка. Только статья научно-популярная больше. Ясное дело что есть информация, которой Вы не очень хотите делиться с сообществом, но было бы неплохо в следующих постах поближе познакомится с OpenCV, до которой, лично у меня, руки не доходят :)
                0
                А haarcasd'иком не поделитесь?
                  0
                  я не использовал haarcascade. Во первых позно нашел упонимание о них, а после понял, что составление хоть сколько нибудь правдаподобной выборки будет очень сложное
                    0
                    а Вы знаки только детектируете или распознаете?
                    Тобешь Вы можете сказать что данный знак указывает или Вы только можете сказать что в данном месте есть знак?
                      0
                      на данный момент детектирование + можно определить группу знака, но сейчас вполтную ведется работа по распознаванию самого знака… подход будет тот же самый скорее всего.
                        0
                        А Вы получаете координаты знака на изображении или как вообще собираетесь его распознавать?
                          0
                          я получаю контур на изображении с координатами конечно. После чего вырезав этот контур из исходного изображения продолжаю над ним издеваться… воть.
                            0
                            а можно с примерами кода? Или приватная информация?
                  0
                  Ситема не сможет распознать знак, если он погнут, закрыт рекламным щитом и тому подобные вещи

                  Если знак закрыт рекламным щитом или деревом или машиной, то его и человек не распознает! :))))
                    0
                    Где код?

                    Only users with full accounts can post comments. Log in, please.