Как распознать автомобильный номерной знак (ANPR) по изображению?

У меня есть веб-сайт, который позволяет пользователям загружать изображения автомобилей, и я хотел бы установить фильтр конфиденциальности для обнаружения номерных знаков на транспортном средстве и их размытия.

Размытие не является проблемой, но есть ли библиотека или компонент (предпочтительно с открытым исходным кодом), который поможет найти лицензию на фотографии?

Предостережения;

  1. Я знаю, что нет ничего идеального, и распознавание изображений этого типа обеспечит ложные положительные и отрицательные стороны.
  2. Я ценю, что мы могли бы попросить пользователя выбрать область размытия, и мы тоже это сделаем, но вопрос заключается именно в том, чтобы найти эти данные программно; поэтому такие ответы, как "попросите человека проверить каждое изображение", бесполезны.
  3. Этот программный метод называется "Автоматическое распознавание номерных знаков" в Великобритании, но я не вижу его реализации в виде библиотек.
  4. Любой язык хорош, хотя предпочтительнее.Net.

12 ответов

Решение

Я кодировал версию C# на основе JAVA ANPR, но я изменил функции библиотеки awt с OpenCV. Вы можете проверить это на http://anprmx.codeplex.com/

РЕДАКТИРОВАТЬ: я написал сценарий Python для этого.

Поскольку ваша цель размыта (для защиты конфиденциальности), вам в основном нужен детектор с высоким уровнем отзыва в качестве первого шага. Вот как это сделать. Включенные подсказки кода используют OpenCV с Python.

  1. Преобразовать в оттенки серого.
  2. Примените Gaussian Blur.

    img = cv2.imread('input.jpg',1)
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    img_gray = cv2.GaussianBlur(img_gray, (5,5), 0)  
    

Пусть входное изображение будет следующим.

  1. Примените фильтр Собела, чтобы обнаружить вертикальные края.
  2. Порог результирующего изображения с использованием строгого порога или бинаризации OTSU.

    cv2.Sobel(image, -1, 1, 0)
    cv2.threshold() 
    
  3. Примените операцию морфологического закрытия, используя подходящий структурирующий элемент. (Я использовал 16x4 в качестве структурирующего элемента)

    se = cv2.getStructuringElement(cv2.MORPH_RECT,(16,4))
    cv2.morphologyEx(image, cv2.MORPH_CLOSE, se)  
    

Результирующее изображение после шага 5.

  1. Найдите внешние контуры этого изображения.

    cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 
    
  2. Для каждого контура найдите minAreaRect() ограничивая это.

  3. Выберите прямоугольники на основе соотношения сторон, минимальной и максимальной площади и угла по горизонтали. (Я использовал 2,2 <= форматное соотношение <= 8, 500 <= площадь <=15000 и угол <= 45 градусов)

Все minAreaRect() s показаны оранжевым цветом, а тот, который удовлетворяет нашим критериям - зеленым.

  1. После этого шага могут быть ложные срабатывания, для фильтрации используйте граничную плотность. Плотность края определяется как количество белых пикселей / общее количество пикселей в прямоугольнике. Установите порог для плотности края. (Я использовал 0,5)

  1. Размытие обнаруженных областей.

Вы можете применять другие фильтры, которые вы считаете подходящими, чтобы увеличить отзыв и точность. Обнаружение также может быть обучено с использованием HOG+SVM для повышения точности.

На GitHub есть новая библиотека с открытым исходным кодом, которая поддерживает ANPR для американских и европейских планшетов. Это выглядит довольно точно, и оно должно делать именно то, что вам нужно (распознавать области пластины). Вот проект GitHub: https://github.com/openalpr/openalpr

Я сталкивался с этим, который написан на java javaANPR, я также ищу библиотеку aC#.

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

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

Попробуйте эту простую автоматическую систему распознавания номерных знаков

http://opos.codeplex.com/

Открытый исходный код и написано с C#

Посмотрите на Java ANPR. Бесплатное распознавание номерного знака...

http://licenseplate.sourceforge.net/ Python (я не проверял это)

Высокопроизводительная библиотека ANPR - http://www.dtksoft.com/dtkanpr.php. Это коммерческий, но они предоставляют пробный ключ.

Да, я использую gocr на http://jocr.sourceforge.net/ это приложение командной строки, которое вы можете запустить из своего приложения. Я использую его в нескольких своих приложениях.

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

Размытие не является проблемой, но есть ли библиотека или компонент (предпочтительно с открытым исходным кодом), который поможет найти лицензию на фотографии?

Ответ: Программный движок CARMEN FreeFlow ANPR (коммерческий)

Другие вопросы по тегам