opex792 commited on
Commit
2d8ec0b
·
verified ·
1 Parent(s): fb0f0d1

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +21 -24
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
- # 1. Конвертируем в оттенки серого. Это делает метод независимым от цвета.
45
- gray_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY)
 
 
 
46
 
47
- # 2. Применяем адаптивное пороговое преобразование.
48
- # Это лучший способ отделить текст от фона с меняющейся яркостью (сетки).
49
- # cv2.ADAPTIVE_THRESH_GAUSSIAN_C: использует взвешенное среднее по Гауссу для определения порога.
50
- # cv2.THRESH_BINARY: основной метод порогового преобразования.
51
- # 15: Размер окрестности для вычисления порога.
52
- # 4: Константа, вычитаемая из среднего значения.
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