Heim > Artikel > Backend-Entwicklung > Wie kann ich mit KNearest- und SVM-Algorithmen ein grundlegendes OCR-System zur Ziffernerkennung in OpenCV-Python implementieren?
Einfache Ziffernerkennung (OCR) in OpenCV-Python
Einführung
Dieser Artikel soll als Leitfaden dienen Sie durch die Implementierung eines einfachen OCR-Systems (Optical Character Recognition) zur Ziffernerkennung unter Verwendung von OpenCV-Python. Wir werden zwei beliebte Algorithmen für maschinelles Lernen untersuchen: KNarest und SVM.
Frage 1: Letter_recognition.data-Datei
Letter_recognition.data ist ein in OpenCV-Python enthaltener Datensatz Proben. Es enthält eine Sammlung handgeschriebener Briefe sowie 16 Merkmalswerte für jeden Buchstaben. Diese Datei dient als Trainingsdaten für verschiedene Zeichenerkennungsaufgaben.
Erstellen Sie Ihre eigenen Letter_recognition.data:
Sie können Ihre eigene Letter_recognition.data-Datei erstellen, indem Sie diese Schritte ausführen :
Frage 2: results.ravel() in KNearest
results.ravel( ) wandelt das Array der erkannten Ziffern von einem mehrdimensionalen Array in ein flaches 1D-Array um. Dies erleichtert die Interpretation und Anzeige der Ergebnisse.
Frage 3: Einfaches Ziffernerkennungstool
Um ein einfaches Ziffernerkennungstool mit letter_recognition.data zu erstellen, befolgen Sie diese Schritte Schritte:
Datenvorbereitung:
Training:
Testen:
Beispielcode :
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)
In diesem Beispiel wird KNearest für die Ziffernerkennung verwendet, aber Sie können es durch SVM ersetzen, indem Sie stattdessen einen SVM-Klassifikator erstellen.
Das obige ist der detaillierte Inhalt vonWie kann ich mit KNearest- und SVM-Algorithmen ein grundlegendes OCR-System zur Ziffernerkennung in OpenCV-Python implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!