Blog Detail

  • Home
  • Найти хозяина по номеру авто: Проверка владельца автомобиля по госномеру онлайн

Найти хозяина по номеру авто: Проверка владельца автомобиля по госномеру онлайн

Обнаружение номерного знака автомобиля и поиск информации о владельце с использованием машинного обучения

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

Каковы варианты использования создания такой системы?

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

Давайте посмотрим, как это реализовать…

Для обнаружения любого номерного знака автомобиля я использовал модель «haarcascade_russian_plate_number.xml», которая точно определяет, показан ли ему какой-либо номерной знак.

Например, после запуска его кода он будет выглядеть так:

Для получения символов номерного знака мы также можем использовать CNN:

 import matplotlib.pyplot as plt
импортировать numpy как np
импорт cv2
# Сопоставьте контуры с номерным знаком или шаблоном персонажа
def find_contours (размеры, изображение):
# Найти все контуры на изображении
cntrs, _ = cv2. findContours(img.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# Получить потенциальные размеры
нижняя_ширина = размеры[0]
верхняя_ширина = размеры[1]
нижняя_высота = размеры[2]
upper_height = размеры[3]

# Проверьте самые большие 5 или 15 контуров для номерного знака или символа соответственно
cntrs = sorted(cntrs, key=cv2.contourArea, reverse=True)[:15]

ii = cv2.imread('контур.jpg')

x_cntr_list = []
target_contours = []
img_res = []
для cntr в cntrs :
# обнаруживает контур в бинарном изображении и возвращает координаты окружающего его прямоугольника
intX, intY, intWidth, intHeight = cv2.boundingRect(cntr)

#проверка размеров контура для фильтрации символов по размеру контура
если intWidth > lower_width и intWidth < upper_width и intHeight > lower_height и intHeight < upper_height:
x_cntr_list.append(intX) #сохраняет x-координату контура персонажа, чтобы использовать ее позже для индексации контуров
char_copy = np.zeros((44,24))
# извлечение каждого символа с использованием координат окружающего прямоугольника. 
char = img[intY:intY+intHeight, intX:intX+intWidth]
символ = cv2.resize (символ, (20, 40))

cv2.rectangle(ii, (intX,intY), (intWidth+intX, intY+intHeight), (50,21,200), 2)
plt.imshow(ii, cmap='серый')
#             Отформатировать результат для классификации: инвертировать цвета
символ = cv2.subtract(255, символ)
# Изменить размер изображения до 24x44 с черной рамкой
char_copy[2:42, 2:22] = символ
char_copy[0:2,:] = 0
char_copy[:, 0:2] = 0
char_copy[42:44,:] = 0
char_copy[:, 22:24] = 0
img_res.append(char_copy) #Список, в котором хранится двоичное изображение персонажа (несортированное)

#Возвращает символы в порядке возрастания относительно координаты x (сначала самый левый символ)

plt.show()
#произвольная функция, хранящая отсортированный список индексов символов
индексы = отсортированные (диапазон (длина (x_cntr_list)), ключ = лямбда k: x_cntr_list [k])
img_res_copy = []
для idx в индексах:
img_res_copy.append(img_res[idx])# сохраняет изображения символов в соответствии с их индексом
img_res = np. массив (img_res_copy)
вернуть img_res
 

Чтобы найти символы на изображении:

 # Найти символы в полученных изображениях
def segment_characters (изображение):
# Предварительно обработать обрезанное изображение номерного знака
img_lp = cv2.resize (изображение, (333, 75))
img_gray_lp = cv2.cvtColor (img_lp, cv2.COLOR_BGR2GRAY)
_, img_binary_lp = cv2.threshold(img_gray_lp, 200, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
img_binary_lp = cv2.erode(img_binary_lp, (3,3))
img_binary_lp = cv2.dilate (img_binary_lp, (3,3))
LP_WIDTH = img_binary_lp.shape[0]
LP_HEIGHT = img_binary_lp.shape[1]
# Сделать границы белыми
img_binary_lp[0:3,:] = 255
img_binary_lp[:,0:3] = 255
img_binary_lp[72:75,:] = 255
img_binary_lp[:,330:333] = 255
# Оценки размеров контуров символов обрезанных номеров
размеры = [LP_WIDTH/6,
LP_WIDTH/2,
LP_HEIGHT/10,
2*LP_HEIGHT/3]
plt.imshow(img_binary_lp, cmap='серый')
plt.show()
cv2.imwrite('контур.jpg',img_binary_lp)
# Получить контуры в обрезанном номерном знаке
char_list = find_contours (размеры, img_binary_lp)
вернуть список_символов
 

Вывод:

Для обучения модели сделано 20 эпох:

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

Теперь, чтобы найти информацию о владельцах по номеру автомобиля, мы либо воспользуемся помощью RTO API, либо создадим API с помощью flask.

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

Нам нужно просто ввести номер автомобиля или загрузить изображение автомобиля с номерным знаком и нажать на кнопку отправки. Далее он покажет информацию об автомобиле и его владельце.

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

Используемый RTO API:

https://www.regcheck.org.uk/

И я использовал его, чтобы найти детали номера, например DL8CAF5030, ниже приведен вывод, который я получил в формате xml. .

Кроме того, для правильной работы серверная часть веб-приложения работает с использованием python и javascript. Также python преобразует этот формат в формат JSON.

Я связал RTO API со своим веб-сервером, чтобы пользователь мог быть перенаправлен на RTO API.

Интерфейсный код (HTML, CSS, JavaScript), который также называется клиентским языком.

Спасибо 😊

Как найти владельца автомобиля по номерному знаку в Кении

  • Автор сообщения: