Ошибка при попытке прочитать текст с картинки easyocr

вот сам код

import cv2
import numpy as np
import imutils
import easyocr
from matplotlib import pyplot as pl

img = cv2.imread('images/lixiang.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

img_filter = cv2.bilateralFilter(gray, 11, 90, 15)
edges = cv2.Canny(img_filter, 50, 200)

cont = cv2.findContours(edges.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)    
cont = imutils.grab_contours(cont)
cont = sorted(cont, key=cv2.contourArea, reverse=True)[:8]

pos = None
for c in cont:
    approx = cv2.approxPolyDP(c, 10, True)

    if len(approx) == 4:
        pos = approx
        break

mask = np.zeros(gray.shape, dtype='uint8')
new_img = cv2.drawContours(mask, [pos], 0, 255, -1)
bitwise_img = cv2.bitwise_and(img, img, mask = mask)

(y, x) = np.where(mask==255 )
(x1, y1) = (np.min(x), np.min(y))
(x2, y2) = (np.max(x), np.max(y))
crop = gray[x1:x2, y1:y2]

text = easyocr.Reader(['en'])
text = text.readtext(crop)

pl.imshow(cv2.cvtColor(crop, cv2.COLOR_BGR2RGB))
pl.show()

ошибка:

 CompleteTraceback (most recent call last):
  File "c:\Users\������������\OneDrive\������� ����\a\OpenCV\numbers_plates.py", line 34, in <module>
    text = easyocr.Reader(['en'])
           ^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\������������\AppData\Local\Programs\Python\Python311\Lib\site-packages\easyocr\easyocr.py", line 92, in __init__
    detector_path = self.getDetectorPath(detect_network)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\������������\AppData\Local\Programs\Python\Python311\Lib\site-packages\easyocr\easyocr.py", line 253, in getDetectorPath
    download_and_unzip(self.detection_models[self.detect_network]['url'], self.detection_models[self.detect_network]['filename'], self.model_storage_directory, self.verbose)
  File "C:\Users\������������\AppData\Local\Programs\Python\Python311\Lib\site-packages\easyocr\utils.py", line 628, in download_and_unzip
    urlretrieve(url, zip_path, reporthook=reporthook)
  File "C:\Users\������������\AppData\Local\Programs\Python\Python311\Lib\urllib\request.py", line 277, in urlretrieve
    reporthook(blocknum, bs, size)
  File "C:\Users\������������\AppData\Local\Programs\Python\Python311\Lib\site-packages\easyocr\utils.py", line 728, in progress_hook
    print(f'\r{prefix} |{bar}| {percent}% {suffix}', end='')
  File "C:\Users\������������\AppData\Local\Programs\Python\Python311\Lib\encodings\cp1251.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeEncodeError: 'charmap' codec can't encode character '\u2588' in position 12: character maps to <undefined>

Ответы (1 шт):

Автор решения: proffessor17

попробуй так -


import cv2
import numpy as np
import imutils
import easyocr
from matplotlib import pyplot as plt
import sys

# Установка кодировки для вывода
sys.stdout.reconfigure(encoding='utf-8')

# Чтение изображения
img = cv2.imread('images/lixiang.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Предобработка изображения
img_filter = cv2.bilateralFilter(gray, 11, 90, 15)
edges = cv2.Canny(img_filter, 50, 200)

# Поиск контуров
cont = cv2.findContours(edges.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cont = imutils.grab_contours(cont)
cont = sorted(cont, key=cv2.contourArea, reverse=True)[:8]

# Поиск номерного знака
pos = None
for c in cont:
    approx = cv2.approxPolyDP(c, 10, True)
    if len(approx) == 4:
        pos = approx
        break

# Создание маски и обрезка изображения
mask = np.zeros(gray.shape, dtype='uint8')
if pos is not None:
    new_img = cv2.drawContours(mask, [pos], 0, 255, -1)
    bitwise_img = cv2.bitwise_and(img, img, mask=mask)
    
    (y, x) = np.where(mask == 255)
    (x1, y1) = (np.min(x), np.min(y))
    (x2, y2) = (np.max(x), np.max(y))
    crop = gray[x1:x2, y1:y2]

    try:
        # Инициализация EasyOCR и чтение текста
        reader = easyocr.Reader(['en'], verbose=False)  # Отключаем вывод прогресса
        text = reader.readtext(crop)
        
        # Вывод результата
        print("Распознанный текст:", text)
        
        # Отображение обрезанного изображения
        plt.imshow(cv2.cvtColor(crop, cv2.COLOR_BGR2RGB))
        plt.axis('off')
        plt.show()
        
    except Exception as e:
        print(f"Ошибка при распознавании текста: {str(e)}")
else:
    print("Номерной знак не найден")

всегда пожалуста!

→ Ссылка