it-roy-ru.com

Каковы хорошие алгоритмы обнаружения номерного знака транспортного средства?

Фон

Для моего последнего проекта в университете я разрабатываю приложение для определения номерного знака транспортного средства. Я считаю себя программистом среднего уровня, однако моим знаниям по математике не хватает ничего, кроме средней школы, что затрудняет создание правильных формул, чем, вероятно, должно быть.

Я потратил много времени на поиск научных работ, таких как:

Когда дело доходит до математики, я заблудился. Благодаря этому тестированию различные графические изображения оказались продуктивными, например:

alt text

в

alt text

Однако этот подход работал только для этого конкретного изображения, и если бы методы применялись к разным изображениям, я уверен, что произойдет более плохое преобразование. Я читал о формуле, называемой «преобразованием морфологии нижнего колонтитула», которая выполняет следующие действия:

По сути, преобразование сохраняет все темные детали изображения и устраняет все остальное (включая большие темные области и светлые области).

Я не могу найти много информации по этому поводу, однако изображение в документации в конце отчета показывает его эффективность. 

Другие ограничения

  • Разработка в C # 
  • Ограничение проекта только регистрационными номерами в Великобритании 
  • Я могу выбрать изображения для преобразования в качестве демонстрации 

Вопрос

Мне нужен совет о том, на каких методах преобразования я должен сосредоточиться, и какие алгоритмы могут мне помочь. 

Правка: новая информация присутствует на продолжение - Обнаружение номерного знака транспортного средства

58
Ash

Есть несколько подходов, которые вы можете использовать, но первая стратегия, которая приходит на ум, это:

  • Обнаружение/исследование. Определите набор цветов и шрифтов, которые вам могут понадобиться. Если ваш образец изображения типичен для большинства британских пластинок, то ваша работа станет проще. Например. Простой, необычный шрифт и черные буквы на белом фоне
  • Код: попытаться определить прямоугольную область изображения, где цвета преимущественно белые и черные. Это не очень сложная математическая проблема, и она должна дать вам область номерного знака, на которой можно сконцентрироваться.
  • Код: Сделайте некоторую очистку в вашем субрегионе, например, преобразование в чистый черный и белый (монохромный) и, возможно, масштабирование/сдвиг в красивый, плотный прямоугольник.
  • Использовать API: Затем примените существующий алгоритм оптического распознавания символов (OCR) к выбранной вами области изображения, чтобы узнать, можете ли вы прочитать текст.

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

13
Paul Sasik

Я сделал похожий проект несколько лет назад на Java, сначала я применил оператор Собеля , а затем замаскировал все изображение изображением пластины (с примененным также оператором Собеля). Область максимального совпадения - это место, где находится пластина. Затем примените OCR к выбранному региону, чтобы получить номер.

3
rodrigoap

Вот как я предлагаю вам выполнить эту задачу. Прочитайте мой подробный ответ здесь

  1. Преобразовать в оттенки серого.
  2. Размытие по Гауссу с фильтром 3х3 или 5х5.
  3. Примените фильтр Собела, чтобы найти вертикальные края. 

    Sobel(gray, dst, -1, 1, 0)

  4. Пороговое значение результирующего изображения, чтобы получить двоичное изображение.
  5. Примените морфологическую операцию закрытия, используя подходящий структурирующий элемент.
  6. Найти контуры полученного изображения.
  7. Найти minAreaRect каждого контура. Выберите прямоугольники на основе соотношения сторон и минимальной и максимальной площади.
  8. Для каждого выбранного контура найдите Плотность кромки. Установите порог для плотности кромок и выберите прямоугольники, нарушающие этот порог, в качестве возможных областей пластины.
  9. Несколько прямоугольников останутся после этого. Вы можете отфильтровать их на основе ориентации или любых критериев, которые вы считаете подходящими.
  10. Обрезать эти обнаруженные прямоугольные части изображения после adaptiveThreshold исходного изображения (в оттенках серого) и применить OCR. 
3
Abdul Fatir

В Великобритании уже есть система, которая это делает. Я помню, как смотрел телешоу, в котором они продемонстрировали, что могут найти машину в Лондоне в течение 10 минут (при условии, что они знают номер и автомобиль едет вокруг) Просто чтение Википедии дает вам подсказки, которые вам нужно начать думать о выпуск: http://en.wikipedia.org/wiki/Automatic_number_plate_recognition

1
Mircea

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

Но, как ответил Пол, вы должны сначала попытаться найти прямоугольную табличку с номером на полном изображении, а затем преобразовать ее в двоичную форму и затем использовать доступные библиотеки OCR (рекомендуется Tesseract)

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

1
Mayank

Он рассказывает вам точно, как вычислить нижнее преобразование (для меня это похоже на инвертированное градуированное преобразование порога).

Первое, что нужно сделать, - реализовать две морфологические функции: расширение и эрозия.

Чтобы сделать это, вам нужны ваши f и b, а затем вы вычисляете функцию для небольшой области изображения в точке, сохраняя наибольшее найденное значение.

(f ⊕ b)(s, t) = max{f (s − x, t − y) + b(x, y)
|(s − x), (t − y) ∈ Df ; (x, y)∈Db}

Это говорит о том, что возьмите максимум выражения во всех точках области домена (например, маленький прямоугольник с центром в вашей точке (s, t).

простой псевдокод будет

max = -infinity // for the point (s,t) on the image, must compute this for all points
for(x = -5 to 5)
for(y = -5 to 5)
max = Max(max, f(s - x, t - y) + b(x,y))

фактически у нас теперь есть новое изображение максимальных значений.

Это на самом деле довольно просто, поэтому не усложняйте его (мы просто добавляем b (x, y) к каждой точке региона и выясняем, какая из них дает максимальное значение).

вы делаете то же самое для эрозии (очень похоже на выше)

Теперь открытие и закрытие - это композиция двух

Вы можете думать об этом сначала как о расширении, а затем об эрозии отверстия.

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

1
AbstractDissonance

Если вас интересует проблема обнаружения наличия номерного знака (в отличие от его распознавания), вам, вероятно, следует обратить внимание на обнаружение текста на изображениях, поскольку оно связано с тем, что вы делаете.

Этот вопрос относится к вашему: Алгоритм обнаружения присутствия текста на изображении

1
carlosdc

Я бы предложил использовать для этого сервис или стороннюю компанию. Open ALPR, предоставляет пакет с открытым исходным кодом, который очень точен для этой услуги.

Откройте ALPR - https://www.openalpr.com/

Демонстрация видео Open ALPR

https://www.youtube.com/watch?v=E-U_H9EbW60

Или вы можете использовать API -

Macgyver Computer Vision API

https://askmacgyver.com/explore/program/license-plate-recognition/3X5D3d2k

В этом API вы просто отправляете запрос на:

https://macgyver.services

Пример полезной нагрузки

{
id: "3X5D3d2k",
key: "free",
data: {
    "image_url": "https://storage.googleapis.com/marketing-files/program-markdown-assets/license-detection/license-plate.jpg",
    "country": "us",
    "numberCandidates": 2
  }
}

 enter image description here

Изображение выше вернет следующее: 

"plate": "284FH8"
"confidence": 90.601013
1
Timothy Moody