Comment puis-je implémenter un système OCR de reconnaissance de chiffres de base dans OpenCV-Python à l'aide des algorithmes KNearest et SVM ?

Linda Hamilton
Libérer: 2024-11-08 16:21:02
original
955 Les gens l'ont consulté

How can I implement a basic digit recognition OCR system in OpenCV-Python using KNearest and SVM algorithms?

OCR de reconnaissance de chiffres simple dans OpenCV-Python

Introduction

Cet article vise à guider vous grâce à la mise en œuvre d'un système de reconnaissance de chiffres de base OCR (Optical Character Recognition) utilisant OpenCV-Python. Nous explorerons deux algorithmes d'apprentissage automatique populaires : KNearest et SVM.

Question 1 : Fichier Letter_recognition.data

Letter_recognition.data est un ensemble de données inclus dans OpenCV-Python des échantillons. Il contient une collection de lettres manuscrites ainsi que 16 valeurs de caractéristiques pour chaque lettre. Ce fichier sert de données d'entraînement pour diverses tâches de reconnaissance de caractères.

Création de votre propre Letter_recognition.data :

Vous pouvez créer votre propre fichier letter_recognition.data en suivant ces étapes. :

  1. Préparez votre ensemble de données de lettres avec chaque lettre représentée sous la forme d'un pixel de 10x10 image.
  2. Extraire les valeurs de pixels de chaque image pour former un vecteur caractéristique de 100 valeurs.
  3. Attribuez manuellement une étiquette (0-25, correspondant à A-Z) à chaque lettre.
  4. Enregistrez les vecteurs de caractéristiques et les étiquettes dans un fichier texte, avec chaque ligne au format :

Question 2 : results.ravel() dans KNearest

results.ravel() convertit le tableau de chiffres reconnus à partir d'un tableau multidimensionnel en tableau 1D plat. Cela facilite l'interprétation et l'affichage des résultats.

Question 3 : Outil de reconnaissance de chiffres simple

Pour créer un outil de reconnaissance de chiffres simple à l'aide de letter_recognition.data, suivez ces étapes :

Données Préparation :

  • Chargez votre fichier letter_recognition.data personnalisé ou utilisez l'exemple d'OpenCV.

Formation :

  • Créer un classificateur KNearest ou SVM exemple.
  • Former le classificateur à l'aide des échantillons et des réponses de letter_recognition.data.

Test :

  • Charger une image contenant des chiffres à reconnaître.
  • Prétraitez l'image pour isoler l'individu chiffres.
  • Convertissez chaque chiffre en un vecteur de caractéristiques (valeurs de 100 pixels).
  • Utilisez le classificateur entraîné pour trouver la correspondance la plus proche pour chaque vecteur de caractéristiques et affichez le chiffre correspondant.

Exemple de code :

import numpy as np
import cv2

# Load data
samples = np.loadtxt('my_letter_recognition.data', np.float32, delimiter=',', converters={ 0 : lambda ch : ord(ch)-ord('A') })
responses = a[:,0]

# Create classifier
model = cv2.KNearest()
model.train(samples, responses)

# Load test image
test_img = cv2.imread('test_digits.png')

# Preprocess image
gray = cv2.cvtColor(test_img, cv2.COLOR_BGR2GRAY)
thresh = cv2.adaptiveThreshold(gray, 255, 1, 1, 11, 2)

# Extract digits
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
digits = []
for cnt in contours:
    if cv2.contourArea(cnt) > 50:
        [x, y, w, h] = cv2.boundingRect(cnt)
        roi = thresh[y:y+h, x:x+w]
        roismall = cv2.resize(roi, (10, 10))
        digits.append(roismall)

# Recognize digits
results = []
for digit in digits:
    roismall = roismall.reshape((1, 100))
    roismall = np.float32(roismall)
    _, results, _, _ = model.find_nearest(roismall, k=1)
    results = results.ravel()
    results = [chr(int(res) + ord('A')) for res in results]

# Display results
output = cv2.cvtColor(test_img, cv2.COLOR_BGR2RGB)
for (digit, (x, y, w, h)) in zip(results, contours):
    cv2.rectangle(output, (x, y), (x + w, y + h), (0, 255, 0), 2)
    cv2.putText(output, str(digit), (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

cv2.imshow('Output', output)
cv2.waitKey(0)
Copier après la connexion

Cet exemple utilise KNearest pour la reconnaissance des chiffres, mais vous pouvez le remplacer par SVM en créant un classificateur SVM à la place.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal