In Python, you can use the SVM or KNearest features of OpenCV library to detect numbers in an image. Below is an example:
Detect Numbers in an Image Using OpenCV
import sys import numpy as np import cv2 im = cv2.imread('numberImage.png') im3 = im.copy() gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) blur = cv2.GaussianBlur(gray,(5,5),0) thresh = cv2.adaptiveThreshold(blur,255,1,1,11,2) contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE) samples = np.empty((0,100)) responses = [] keys = [i for i in range(48,58)] for cnt in contours: if cv2.contourArea(cnt)>50: [x,y,w,h] = cv2.boundingRect(cnt) if h>28: cv2.rectangle(im,(x,y),(x+w,y+h),(0,0,255),2) roi = thresh[y:y+h,x:x+w] roismall = cv2.resize(roi,(10,10)) cv2.imshow('norm',im) key = cv2.waitKey(0) if key == 27: # (escape to quit) sys.exit() elif key in keys: responses.append(int(chr(key))) sample = roismall.reshape((1,100)) samples = np.append(samples,sample,0) responses = np.array(responses,np.float32) responses = responses.reshape((responses.size,1)) print "training complete" np.savetxt('generalsamples.data',samples) np.savetxt('generalresponses.data',responses)
Code Explanation
- Â The code starts by importing the necessary libraries.
- Â It then loads a picture of a number image from disk, converts it to grayscale, and blurs it with Gaussian blur.
- Â The code then finds contours in the image using cv2.findContours().
- Â After finding all the contours, they are sorted into order according to their size (largest first).
- Â The next step is to find out which keys on the keyboard correspond with each number on the range from 48-58.
- Â This is done by looping through every contour and checking if its area exceeds 50 pixels.
- Â If so, it creates an empty list called responses that will contain one value for each key pressed on your keyboard when you press enter at any time during this program's execution.
- Â Then for each contour found in step 1, we check if its height exceeds 28 pixels; if so, we create a rectangle around that point using cv2.rectangle() and show it as white against black background using cv2.imshow('norm',im) .
- Â We also store this information about what was clicked in our variable key , which corresponds with 27 on your keyboard because pressing escape terminates this program prematurely (27 = Esc).
- Â For every other key pressed
- Â The code is a Python script that reads in the "numberImage.png" file, then applies a Gaussian blur to it and finds contours.
- Â It then uses those contours to create an array of points called "samples".
- Â The next step is to find the responses for each point in the array of samples by using a list comprehension.
- Â This will generate an output that looks like this: [0, 0, 1, 1].
I hope the above example with explanation helped you understand the code as well as detect the numbers in an image using the Python OpenCV library.