Simple Digit Recognition OCR in OpenCV-Python
Introduction
This article aims to guide you through the implementation of a basic digit recognition OCR (Optical Character Recognition) system using OpenCV-Python. We'll explore two popular machine learning algorithms: KNearest and SVM.
Question 1: Letter_recognition.data File
Letter_recognition.data is a dataset included in OpenCV-Python samples. It contains a collection of handwritten letters along with 16 feature values for each letter. This file serves as training data for various character recognition tasks.
Building Your Own Letter_recognition.data:
You can create your own letter_recognition.data file by following these steps:
Question 2: results.ravel() in KNearest
results.ravel() converts the array of recognized digits from a multi-dimensional array to a flat 1D array. This makes it easier to interpret and display the results.
Question 3: Simple Digit Recognition Tool
To create a simple digit recognition tool using letter_recognition.data, follow these steps:
Data Preparation:
Training:
Testing:
Example 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)
This example uses KNearest for digit recognition, but you can replace it with SVM by creating an SVM classifier instead.
The above is the detailed content of How can I implement a basic digit recognition OCR system in OpenCV-Python using KNearest and SVM algorithms?. For more information, please follow other related articles on the PHP Chinese website!