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. :
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 :
Formation :
Test :
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)
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!