Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich mit KNearest- und SVM-Algorithmen ein grundlegendes OCR-System zur Ziffernerkennung in OpenCV-Python implementieren?

Wie kann ich mit KNearest- und SVM-Algorithmen ein grundlegendes OCR-System zur Ziffernerkennung in OpenCV-Python implementieren?

Linda Hamilton
Linda HamiltonOriginal
2024-11-08 16:21:02964Durchsuche

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

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 :

  1. Bereiten Sie Ihren Buchstabendatensatz vor, wobei jeder Buchstabe als 10x10-Pixel-Bild dargestellt wird.
  2. Extrahieren Sie Pixelwerte aus jedem Bild, um einen Merkmalsvektor mit 100 Werten zu bilden.
  3. Weisen Sie jedem Buchstaben manuell eine Beschriftung (0-25, entsprechend A-Z) zu.
  4. Speichern Sie die Feature-Vektoren und Beschriftungen in einer Textdatei, wobei jede Zeile das folgende Format hat:

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:

  • Laden Sie Ihre benutzerdefinierte Datei „letter_recognition.data“ oder verwenden Sie das Beispiel von OpenCV.

Training:

  • Erstellen Sie eine KNearest- oder SVM-Klassifikatorinstanz.
  • Trainieren Sie den Klassifikator mithilfe der Beispiele und Antworten aus letter_recognition.data.

Testen:

  • Laden Sie ein Bild mit zu erkennenden Ziffern.
  • Verarbeiten Sie das Bild vor, um einzelne Ziffern zu isolieren.
  • Konvertieren Sie jede Ziffer Ziffer in einen Merkmalsvektor (100 Pixelwerte).
  • Verwenden Sie den trainierten Klassifikator, um die nächste Übereinstimmung für jeden Merkmalsvektor zu finden und die entsprechende Ziffer anzuzeigen.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn