распознавание капчи с помощью pytesseract

Рейтинг: 3Ответов: 1Опубликовано: 14.08.2023

У меня есть капча, которую мне надо научиться распознавать:

введите сюда описание изображения введите сюда описание изображения

Сначала я ее видоизменяю, удаляя полоски и фон, получая вот такое изображение:

введите сюда описание изображения введите сюда описание изображения

но pytesseract все равно не может распознать эту задекодированную капчу. Подскажите пожалуйста. Может мне нужно взять другой конфиг(я использую --oem 3 --psm 7) или разбить капчу на символы и перебрать каждый, а в конце собрать все воедино, и как это можно сделать.

Мой код:

import cv2
import pytesseract
from colorama import Fore
from PIL import Image


im = Image.open("img.jpg")

im2 = Image.new("RGB", im.size,255)


pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'
            

cfg = r'--oem 3 --psm 7'
verifcode = pytesseract.image_to_string(Image.open('output.jpg'), config=cfg).replace(" ", "")
print(Fore.LIGHTBLUE_EX + "\nКод верификации:", verifcode)

cv2.waitKey(0)

Ответы

▲ 4Принят

Вы можете использовать https://cloudmersive.com/ocr-api для меня это выдало наибольшую точность вот код который позволит туда, обратится:

import requests
import re


class CaptchaSolver:
    def __init__(self, proxy=None):
        self._s = requests.Session()
        if proxy:
            self._s.proxies.update({'http': proxy, 'https': proxy})
        self.__event_validation = None
        self.__view_state = None
        self.__save_data(self._s.get('https://cloudmersive.com/ocr-api').text)

    def __save_data(self, text):
        self.__event_validation = re.findall(r'__EVENTVALIDATION".*value="(.*)"', text)[0]
        self.__view_state = re.findall(r'__VIEWSTATE".*value="(.*)"', text)[0]

    @staticmethod
    def __get_captcha_result(text):
        result = re.findall(f'TextResult":.*"(.*)"', text)
        if result:
            return result[0].replace('\\n', '')
        return ''

    def solve(self, image: open) -> str:
        """
        Method for solving regular text captcha.
        :param image: open(file, 'rb')
        """
        data = {
            '__EVENTVALIDATION': self.__event_validation,
            '__VIEWSTATE': self.__view_state,
            'ctl00$MainContent$LanguageSelector': 'eng',
            'ctl00$MainContent$btnUpload2': 'Photos of Docs to Text'
        }

        r = self._s.post('https://cloudmersive.com/ocr-api', data=data,
                         files={'ctl00$MainContent$FileUploadBox': image})
        if not r.ok:
            return ''
        self.__save_data(r.text)
        return self.__get_captcha_result(r.text)


if __name__ == '__main__':
    captcha_solver = CaptchaSolver()
    print(captcha_solver.solve(open('img.png', 'rb')))

Этот ocr лучше работает на необработанных вами изображениях
На первом изображении выдаёт 922412 не распознало семёрку
На втором 15 90 02 если убрать пробелы то всё правильно.
Вы можете попробовать добавить размытие перед treshhold, чтобы убрать не чёткости и сделать текст чёрным (ocr показывают при этом большую точность)
pytesseract - несильно хорош в распознавание искажённых букв