Этот урок описывает распознавание номерных знаков на изображениях и извлечение информации с использованием OpenCV и дополнительных библиотек Python. В отличие от предыдущего урока, здесь не применяется предобученная модель; вместо этого, используются сторонние библиотеки для считывания текста, а поиск номерных знаков осуществляется с помощью OpenCV.
Необходимые библиотеки
Перед началом работы установите следующие библиотеки:
- EasyOCR: для распознавания текста (pip install easyocr).
- OpenCV (cv2): для обработки изображений (предполагается, что уже установлена).
- imutils: дополнительные функции для работы с изображениями (pip install imutils).
- matplotlib: для отображения изображений (pip install matplotlib).
Обработка изображения
- Загрузка: img = cv2.imread(‘path/to/image.jpg’)
- Преобразование в серый формат: gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
- Отображение (matplotlib): img_rgb = cv2.cvtColor(gray, cv2.COLOR_GRAY2RGB); plt.imshow(img_rgb); plt.show()
- Уменьшение шума: Билатеральный фильтр:
blurred = cv2.bilateralFilter(gray, 11, 15, 15)
Параметры (11, 15, 15) могут изменяться.
- Поиск контуров:
edged = cv2.Canny(blurred, 30, 200) contours, _ = cv2.findContours(edged, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
Отбор контуров, похожих на номерной знак
- Сортировка: Контуры сортируются по площади (8 самых больших):
contours = sorted(contours, key=cv2.contourArea, reverse=True)[:8]
- Аппроксимация: cv2.approxPolyDP() используется для поиска контуров, близких к прямоугольнику (4 вершины):
for c in contours: approx = cv2.approxPolyDP(c, 0.01 * cv2.arcLength(c, True), True) if len(approx) == 4: position = approx break
Выделение номерного знака
- Маска:
mask = np.zeros(gray.shape, np.uint8) new_image = cv2.drawContours(mask, [position], 0, 255, -1) bitwiseAnd = cv2.bitwise_and(gray, gray, mask=mask)
- Вырезание:
(x, y) = np.where(mask == 255) (x1, y1) = (np.min(x), np.min(y)) (x2, y2) = (np.max(x), np.max(y)) cropped = gray[x1:x2+1, y1:y2+1]
Распознавание текста
Библиотека EasyOCR используется для распознавания текста:
reader = easyocr.Reader(['en']) # 'en' - английский язык
text = reader.readtext(cropped)
Вывод результата
Результат выводится на исходное изображение:
text = text[0][1]
cv2.putText(img, text, (x1, y2 + 60), cv2.FONT_HERSHEY_PLAIN, 3, (0, 0, 255), 2)
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)); plt.show()
Данный метод может давать неточные результаты. Для повышения точности рекомендуется использовать предобученные или собственные нейронные сети. Тем не менее, он демонстрирует базовые принципы обработки изображений и распознавания текста с помощью Python и OpenCV.