Spaces:
Sleeping
Sleeping
Upload app.py
Browse files
app.py
CHANGED
|
@@ -20,10 +20,6 @@ HEADERS = {
|
|
| 20 |
}
|
| 21 |
|
| 22 |
def fetch_and_solve_captcha():
|
| 23 |
-
"""
|
| 24 |
-
Получает, обрабатывает и распознает капчу, используя надежный метод
|
| 25 |
-
адаптивного порогового преобразования.
|
| 26 |
-
"""
|
| 27 |
try:
|
| 28 |
logging.info("Получение новой капчи...")
|
| 29 |
response = requests.get(CAPTCHA_URL, headers=HEADERS)
|
|
@@ -39,33 +35,35 @@ def fetch_and_solve_captcha():
|
|
| 39 |
nparr = np.frombuffer(image_bytes, np.uint8)
|
| 40 |
original_image = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
|
| 41 |
|
| 42 |
-
# ---
|
|
|
|
|
|
|
|
|
|
|
|
|
| 43 |
|
| 44 |
-
#
|
| 45 |
-
|
|
|
|
|
|
|
|
|
|
| 46 |
|
| 47 |
-
#
|
| 48 |
-
#
|
| 49 |
-
#
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
processed_image = cv2.adaptiveThreshold(
|
| 54 |
-
gray_image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
|
| 55 |
-
cv2.THRESH_BINARY, 15, 4)
|
| 56 |
-
|
| 57 |
-
# 3. Инвертируем изображение (Tesseract лучше работает с черным текстом на белом фоне)
|
| 58 |
-
processed_image = cv2.bitwise_not(processed_image)
|
| 59 |
|
| 60 |
-
# 4
|
| 61 |
-
|
|
|
|
|
|
|
|
|
|
| 62 |
tesseract_config = r'--oem 3 --psm 7 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
|
| 63 |
text = pytesseract.image_to_string(processed_image, config=tesseract_config)
|
| 64 |
recognized_text = re.sub(r'\s+', '', text).strip() or "Не распознано"
|
| 65 |
-
|
| 66 |
logging.info(f"Распознано: {recognized_text}")
|
| 67 |
|
| 68 |
-
# Кодируем изображения обратно в base64 для отображения в HTML
|
| 69 |
_, buffer_orig = cv2.imencode('.png', original_image)
|
| 70 |
original_b64 = base64.b64encode(buffer_orig).decode('utf-8')
|
| 71 |
|
|
@@ -104,4 +102,3 @@ if __name__ == '__main__':
|
|
| 104 |
app.run(host='0.0.0.0', port=7860, debug=False)
|
| 105 |
|
| 106 |
|
| 107 |
-
|
|
|
|
| 20 |
}
|
| 21 |
|
| 22 |
def fetch_and_solve_captcha():
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
try:
|
| 24 |
logging.info("Получение новой капчи...")
|
| 25 |
response = requests.get(CAPTCHA_URL, headers=HEADERS)
|
|
|
|
| 35 |
nparr = np.frombuffer(image_bytes, np.uint8)
|
| 36 |
original_image = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
|
| 37 |
|
| 38 |
+
# --- Этап 1: Фильтрация по цвету (остается без изменений) ---
|
| 39 |
+
hsv = cv2.cvtColor(original_image, cv2.COLOR_BGR2HSV)
|
| 40 |
+
lower_blue = np.array([90, 50, 50])
|
| 41 |
+
upper_blue = np.array([130, 255, 255])
|
| 42 |
+
mask = cv2.inRange(hsv, lower_blue, upper_blue)
|
| 43 |
|
| 44 |
+
# --- ЭТАП 2: УЛУЧШЕННАЯ ОЧИСТКА (НОВЫЙ ПОДХОД) ---
|
| 45 |
+
# Сначала очень нежно убираем мелкий шум операцией "открытия"
|
| 46 |
+
# Ядро 1x1 и 2 итерации - это очень щадящий способ.
|
| 47 |
+
opening_kernel = np.ones((1, 1), np.uint8)
|
| 48 |
+
cleaned_mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, opening_kernel, iterations=2)
|
| 49 |
|
| 50 |
+
# --- ЭТАП 3: "УТОЛЩЕНИЕ" СИМВОЛОВ (КЛЮЧЕВОЙ ШАГ ДЛЯ СТАБИЛЬНОСТИ) ---
|
| 51 |
+
# Слегка "раздуваем" (dilate) оставшиеся контуры.
|
| 52 |
+
# Это делает символы жирными и соединяет разрывы, что идеально для Tesseract.
|
| 53 |
+
dilation_kernel = np.ones((2, 2), np.uint8)
|
| 54 |
+
dilated_mask = cv2.dilate(cleaned_mask, dilation_kernel, iterations=1)
|
| 55 |
+
logging.info("Символы утолщены для улучшения распознавания.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 56 |
|
| 57 |
+
# --- Этап 4: Инверсия и распознавание ---
|
| 58 |
+
processed_image = cv2.bitwise_not(dilated_mask)
|
| 59 |
+
|
| 60 |
+
# Оставляем и буквы, и цифры, так как оба варианта встречаются.
|
| 61 |
+
# Улучшенная обработка не даст Tesseract путать '8' и 'S'.
|
| 62 |
tesseract_config = r'--oem 3 --psm 7 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
|
| 63 |
text = pytesseract.image_to_string(processed_image, config=tesseract_config)
|
| 64 |
recognized_text = re.sub(r'\s+', '', text).strip() or "Не распознано"
|
|
|
|
| 65 |
logging.info(f"Распознано: {recognized_text}")
|
| 66 |
|
|
|
|
| 67 |
_, buffer_orig = cv2.imencode('.png', original_image)
|
| 68 |
original_b64 = base64.b64encode(buffer_orig).decode('utf-8')
|
| 69 |
|
|
|
|
| 102 |
app.run(host='0.0.0.0', port=7860, debug=False)
|
| 103 |
|
| 104 |
|
|
|