Как мне на самом деле получить изображение в текстовую переменную? Я узнал о сопоставлении с шаблоном, но не понимаю, как мне действовать дальше.
Сопоставление с шаблоном используется для определения местоположения объекта на изображении по заданному шаблону, не для извлечения текста из изображения. Сопоставление шаблона с положением объекта на изображении не поможет получить текст в виде строки. Для примеров того, как применить динамическое сопоставление с шаблоном варианта c, посмотрите как изолировать все внутри контура, масштабировать его и проверить сходство с изображением? и Python Обнаружение линии OpenCV для обнаружения символа X на изображении . Я не понимаю, почему не хотел бы использовать библиотеку OCR. Если вы хотите извлечь текст из изображения как строковую переменную, вы должны использовать какой-то тип глубокого / машинного обучения. PyTesseract, вероятно, самый простой. Вот решение с использованием PyTesseract
Идея состоит в том, чтобы получить двоичное изображение с использованием порога Оцу, а затем выполнить фильтрацию площади контура и соотношения сторон для извлечения букв / цифр. Отсюда мы используем Numpy нарезку, чтобы обрезать каждый ROI на пустую маску, а затем применить OCR, используя Pytesseract. Вот визуализация каждого шага:
Двоичное изображение
Обнаруженные области интереса выделены зеленым цветом
Изолированные области интереса на пустой маске, готовой к распознаванию символов
Мы используем опцию конфигурации --psm 6
, чтобы сообщить Pytesseract о принятии единообразного блока текста. Посмотрите здесь для получения дополнительных параметров конфигурации . Результат от Pytesseract:
XS NB 23
Код
import cv2
import numpy as np
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
# Load image, create mask, grayscale, Otsu's threshold
image = cv2.imread('1.png')
mask = np.zeros(image.shape, dtype=np.uint8)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
# Filter for ROI using contour area and aspect ratio
cnts = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
area = cv2.contourArea(c)
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.05 * peri, True)
x,y,w,h = cv2.boundingRect(approx)
aspect_ratio = w / float(h)
if area > 2000 and aspect_ratio > .5:
mask[y:y+h, x:x+w] = image[y:y+h, x:x+w]
# Perfrom OCR with Pytesseract
data = pytesseract.image_to_string(mask, lang='eng', config='--psm 6')
print(data)
cv2.imshow('thresh', thresh)
cv2.imshow('mask', mask)
cv2.waitKey()