πŸ” Как Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ Ρ†ΠΈΡ„Ρ€Ρ‹ с ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python?

Для распознавания Ρ†ΠΈΡ„Ρ€ с ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π² Python Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ OpenCV Π² сочСтании с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ Tesseract. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°:


import cv2
import pytesseract

# Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° изобраТСния
image = cv2.imread('image.jpg')

# ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° изобраТСния
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
threshold = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

# ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ OCR-Π΄Π²ΠΈΠΆΠΊΠ°
text = pytesseract.image_to_string(threshold, config='--psm 6 digits')

# Π’Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°
print(f"РаспознанныС Ρ†ΠΈΡ„Ρ€Ρ‹: {text}")
    

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ OpenCV, выполняСм ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ распознаваниС, ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ OCR-Π΄Π²ΠΈΠΆΠΎΠΊ Tesseract для распознавания Ρ†ΠΈΡ„Ρ€. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ распознанных Ρ†ΠΈΡ„Ρ€.

Π”Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚

Как Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ Ρ†ΠΈΡ„Ρ€Ρ‹ с ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π² Python

ΠŸΡ€ΠΈΠ²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽ! Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ, ΠΊΠ°ΠΊ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ Ρ†ΠΈΡ„Ρ€Ρ‹ с ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python. Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ OpenCV, которая прСдоставляСт ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ инструмСнты для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

Π¨Π°Π³ 1: Установка Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ OpenCV

ΠŸΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ OpenCV. Для этого Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

pip install opencv-python

ПослС установки OpenCV ΠΌΡ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΡˆΠ°Π³Ρƒ.

Π¨Π°Π³ 2: Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈ ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° изобраТСния

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ Ρ†ΠΈΡ„Ρ€Ρ‹ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ нСсколько ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΎΠΊ. Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ:

import cv2
  
  def preprocess_image(image_path):
      # Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° изобраТСния
      image = cv2.imread(image_path)
      
      # ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ изобраТСния Π² ΠΎΡ‚Ρ‚Π΅Π½ΠΊΠΈ сСрого
      gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
      
      # ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ значСния для ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ контраста
      _, threshold = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
      
      # ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ размытия, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ ΡˆΡƒΠΌ
      blurred = cv2.GaussianBlur(threshold, (5, 5), 0)
      
      return blurred

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ preprocess_image ΠΌΡ‹ сначала Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ cv2.imread. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ Π΅Π³ΠΎ Π² ΠΎΡ‚Ρ‚Π΅Π½ΠΊΠΈ сСрого ΠΈ примСняСм ΠΏΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ cv2.threshold, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ контраст. ПослС этого ΠΌΡ‹ примСняСм ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ размытия с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ cv2.GaussianBlur, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ ΡˆΡƒΠΌ. На Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

Π¨Π°Π³ 3: РаспознаваниС Ρ†ΠΈΡ„Ρ€

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡŽ Ρ†ΠΈΡ„Ρ€ Π½Π° Π½Π΅ΠΌ. Для этого Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ:

def recognize_digits(image):
      # Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ распознавания Ρ†ΠΈΡ„Ρ€
      model = cv2.dnn.readNetFromMNIST('mnist_model.pb')
      
      # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΏΠΈΠΈ изобраТСния
      output = image.copy()
      
      # ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° изобраТСния для получСния ΠΊΠΎΠ½Ρ‚ΡƒΡ€ΠΎΠ²
      contours, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
      
      for contour in contours:
          (x, y, w, h) = cv2.boundingRect(contour)
          
          # Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ слишком ΠΌΠ°Π»Π΅Π½ΡŒΠΊΠΈΡ… ΠΊΠΎΠ½Ρ‚ΡƒΡ€ΠΎΠ²
          if w >= 5 and h >= 25:
              # Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ†ΠΈΡ„Ρ€Ρ‹ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΅Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π΄ΠΎ 28x28 пиксСлСй
              digit = image[y:y+h, x:x+w]
              resized_digit = cv2.resize(digit, (28, 28))
              input_data = cv2.dnn.blobFromImage(resized_digit)
              
              # ΠŸΠΎΠ΄Π°Ρ‡Π° изобраТСния Π½Π° Π²Ρ…ΠΎΠ΄ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ прСдсказания
              model.setInput(input_data)
              output_data = model.forward()
              
              # ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ индСкса класса с наибольшСй Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ
              digit_value = np.argmax(output_data)
              
              # ΠžΡ‚Ρ€ΠΈΡΠΎΠ²ΠΊΠ° распознанной Ρ†ΠΈΡ„Ρ€Ρ‹ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ
              cv2.rectangle(output, (x, y), (x + w, y + h), (0, 255, 0), 2)
              cv2.putText(output, str(digit_value), (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
      
      return output

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ recognize_digits ΠΌΡ‹ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ модСль распознавания Ρ†ΠΈΡ„Ρ€ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ cv2.dnn.readNetFromMNIST. Π”Π°Π»Π΅Π΅ ΠΌΡ‹ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π°ΠΌ Π½Π° ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ слишком малСнькиС ΠΊΠΎΠ½Ρ‚ΡƒΡ€Ρ‹. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π° ΠΌΡ‹ выдСляСм Ρ†ΠΈΡ„Ρ€Ρƒ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, измСняСм Π΅Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π΄ΠΎ 28x28 пиксСлСй с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ cv2.resize ΠΈ ΠΏΠΎΠ΄Π°Π΅ΠΌ Π½Π° Π²Ρ…ΠΎΠ΄ ΠΌΠΎΠ΄Π΅Π»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ model.setInput. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ прСдсказаниС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ model.forward ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ индСкс класса с наибольшСй Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ np.argmax. НаконСц, ΠΌΡ‹ отрисовываСм Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π½Π½ΡƒΡŽ Ρ†ΠΈΡ„Ρ€Ρƒ Π½Π° исходном ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ cv2.rectangle ΠΈ cv2.putText. На Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с распознанными Ρ†ΠΈΡ„Ρ€Π°ΠΌΠΈ.

Π¨Π°Π³ 4: Запуск ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Ρƒ нас Π΅ΡΡ‚ΡŒ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ΄ для распознавания Ρ†ΠΈΡ„Ρ€ Π½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ:

import numpy as np

  # ΠŸΡƒΡ‚ΡŒ ΠΊ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ
  image_path = 'image.png'

  # Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈ ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° изобраТСния
  preprocessed_image = preprocess_image(image_path)

  # РаспознаваниС Ρ†ΠΈΡ„Ρ€
  result_image = recognize_digits(preprocessed_image)

  # ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ изобраТСния
  cv2.imshow('Result', result_image)
  cv2.waitKey(0)
  cv2.destroyAllWindows()

Π’ ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΌΡ‹ сначала Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ ΠΈ ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ preprocess_image. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ примСняСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ recognize_digits для распознавания Ρ†ΠΈΡ„Ρ€ Π½Π° ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ. НаконСц, ΠΌΡ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с распознанными Ρ†ΠΈΡ„Ρ€Π°ΠΌΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ cv2.imshow.

Π’Ρ‹Π²ΠΎΠ΄

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ Ρ†ΠΈΡ„Ρ€Ρ‹ с ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π² Python с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ OpenCV. ΠœΡ‹ рассмотрСли ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ шаг: установка Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ OpenCV, Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈ ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° изобраТСния, Π° Ρ‚Π°ΠΊΠΆΠ΅ распознаваниС Ρ†ΠΈΡ„Ρ€. НС Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ эти знания Π² своих ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… ΠΈ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ для достиТСния Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΡ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ²!

Π’ΠΈΠ΄Π΅ΠΎ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

РаспознаваниС тСкста с изобраТСния Π½Π° Python | EasyOCR vs Tesseract | ΠšΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠ΅ Π·Ρ€Π΅Π½ΠΈΠ΅

Как Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ тСкст с ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ / ΡƒΡ€ΠΎΠΊΠΈ Python

Π£Ρ‡ΠΈΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ тСкст Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°Ρ…, Π²ΠΈΠ΄Π΅ΠΎ, ΠΈΠ³Ρ€Π°Ρ… β–² Python + OpenCV + Tesseract

ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ:

⌨️ Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ†ΠΈΡ„Ρ€Ρ‹ Π² ΠΏΠΈΡ‚ΠΎΠ½Π΅: простой ΠΏΠΎΡˆΠ°Π³ΠΎΠ²Ρ‹ΠΉ Π³ΠΈΠ΄ для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…

πŸ”„ Как ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Python Π½Π° Linux Debian: пошаговоС руководство

Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π² Python

πŸ” Как Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ Ρ†ΠΈΡ„Ρ€Ρ‹ с ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python?

πŸ” Как Π½Π°ΠΉΡ‚ΠΈ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» Π±Π΅Π· Ρ†ΠΈΠΊΠ»Π° Π² Python: простыС способы ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

πŸ”‘ Как ввСсти 2 ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² Python: простой ΠΏΡƒΡ‚Π΅Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ classmethod Π² Python? Π£Π·Π½Π°ΠΉΡ‚Π΅ простым ΠΈ понятным языком