├── README.md ├── image ├── 000.png ├── 001.png ├── 100.png ├── 101.png ├── 200.png ├── 201.png ├── 300.png ├── 303.png ├── 400.png ├── 401.png ├── 500.png ├── 501.png ├── 600.png ├── 601.png ├── 700.png ├── 701.png ├── 800.png ├── 801.png ├── 900.png └── 901.png ├── model.xml ├── read_digit.py ├── sample.png └── svm_model.py /README.md: -------------------------------------------------------------------------------- 1 | # SVM_Recognizing_Digit 2 | Recognizing 7 segment digit by OpenCV SVM model 3 | 4 | Inspired from below project by Adrian Rosebrock 5 | 6 | https://www.pyimagesearch.com/2017/02/13/recognizing-digits-with-opencv-and-python/ 7 | 8 | Using SVM model with 20 training images to replace the original handicrafted recognition process 9 | 10 | result of svm_model.py: 11 | 12 | ![svm_model](https://user-images.githubusercontent.com/17492814/58760250-fa5c7600-8567-11e9-865f-0bc85d231ec2.JPG) 13 | 14 | 15 | Reading 7-segment digit from digital device screen (e.g. clock, electronic scale etc) 16 | 17 | result of read_digit.py by reading image sample.png: 18 | 19 | ![predict_result](https://user-images.githubusercontent.com/17492814/58760414-119c6300-856a-11e9-891c-9a32e9997c74.JPG) 20 | -------------------------------------------------------------------------------- /image/000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shanlau/SVM_Recognizing_Digit/006f107e5203adf52b5978f5ad34cf89ae2817c2/image/000.png -------------------------------------------------------------------------------- /image/001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shanlau/SVM_Recognizing_Digit/006f107e5203adf52b5978f5ad34cf89ae2817c2/image/001.png -------------------------------------------------------------------------------- /image/100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shanlau/SVM_Recognizing_Digit/006f107e5203adf52b5978f5ad34cf89ae2817c2/image/100.png -------------------------------------------------------------------------------- /image/101.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shanlau/SVM_Recognizing_Digit/006f107e5203adf52b5978f5ad34cf89ae2817c2/image/101.png -------------------------------------------------------------------------------- /image/200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shanlau/SVM_Recognizing_Digit/006f107e5203adf52b5978f5ad34cf89ae2817c2/image/200.png -------------------------------------------------------------------------------- /image/201.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shanlau/SVM_Recognizing_Digit/006f107e5203adf52b5978f5ad34cf89ae2817c2/image/201.png -------------------------------------------------------------------------------- /image/300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shanlau/SVM_Recognizing_Digit/006f107e5203adf52b5978f5ad34cf89ae2817c2/image/300.png -------------------------------------------------------------------------------- /image/303.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shanlau/SVM_Recognizing_Digit/006f107e5203adf52b5978f5ad34cf89ae2817c2/image/303.png -------------------------------------------------------------------------------- /image/400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shanlau/SVM_Recognizing_Digit/006f107e5203adf52b5978f5ad34cf89ae2817c2/image/400.png -------------------------------------------------------------------------------- /image/401.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shanlau/SVM_Recognizing_Digit/006f107e5203adf52b5978f5ad34cf89ae2817c2/image/401.png -------------------------------------------------------------------------------- /image/500.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shanlau/SVM_Recognizing_Digit/006f107e5203adf52b5978f5ad34cf89ae2817c2/image/500.png -------------------------------------------------------------------------------- /image/501.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shanlau/SVM_Recognizing_Digit/006f107e5203adf52b5978f5ad34cf89ae2817c2/image/501.png -------------------------------------------------------------------------------- /image/600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shanlau/SVM_Recognizing_Digit/006f107e5203adf52b5978f5ad34cf89ae2817c2/image/600.png -------------------------------------------------------------------------------- /image/601.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shanlau/SVM_Recognizing_Digit/006f107e5203adf52b5978f5ad34cf89ae2817c2/image/601.png -------------------------------------------------------------------------------- /image/700.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shanlau/SVM_Recognizing_Digit/006f107e5203adf52b5978f5ad34cf89ae2817c2/image/700.png -------------------------------------------------------------------------------- /image/701.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shanlau/SVM_Recognizing_Digit/006f107e5203adf52b5978f5ad34cf89ae2817c2/image/701.png -------------------------------------------------------------------------------- /image/800.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shanlau/SVM_Recognizing_Digit/006f107e5203adf52b5978f5ad34cf89ae2817c2/image/800.png -------------------------------------------------------------------------------- /image/801.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shanlau/SVM_Recognizing_Digit/006f107e5203adf52b5978f5ad34cf89ae2817c2/image/801.png -------------------------------------------------------------------------------- /image/900.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shanlau/SVM_Recognizing_Digit/006f107e5203adf52b5978f5ad34cf89ae2817c2/image/900.png -------------------------------------------------------------------------------- /image/901.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shanlau/SVM_Recognizing_Digit/006f107e5203adf52b5978f5ad34cf89ae2817c2/image/901.png -------------------------------------------------------------------------------- /read_digit.py: -------------------------------------------------------------------------------- 1 | from imutils import contours 2 | import imutils 3 | import cv2 4 | import numpy as np 5 | 6 | 7 | image = cv2.imread("sample.png") 8 | 9 | image = imutils.resize(image, height=500) 10 | contrast = cv2.convertScaleAbs(image, alpha=5, beta=90) 11 | gray = cv2.cvtColor(contrast, cv2.COLOR_BGR2GRAY) 12 | threshold = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1] 13 | kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (15, 15)) 14 | img = cv2.morphologyEx(threshold, cv2.MORPH_OPEN, kernel) 15 | 16 | cnts = cv2.findContours(img.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) 17 | cnts = imutils.grab_contours(cnts) 18 | #cv2.drawContours(image,cnts,-1,(0, 255, 0), 2) 19 | boundingRect = [] 20 | for c in cnts: 21 | (x, y, w, h) = cv2.boundingRect(c) 22 | if (h > image.shape[0]*0.3 and h 0 and pbuttom > 0 and pleft > 0 and pright > 0): 43 | constant = cv2.copyMakeBorder(d,ptop,pbuttom,pleft,pright,cv2.BORDER_CONSTANT,value=[255,255,255]) 44 | print(constant.shape) 45 | reshape = imutils.resize(constant, height=standard,width=standard) 46 | #cv2.imshow("Image", reshape) 47 | #cv2.waitKey(0) 48 | test_data.append(reshape) 49 | 50 | 51 | test_data = np.asarray(test_data, dtype=np.float32) 52 | print(test_data.shape) 53 | test_data = np.reshape(test_data,(test_data.shape[0],standard*standard)) 54 | print(test_data.shape) 55 | 56 | #load model 57 | model2 = cv2.ml.SVM_load("model.xml") 58 | _, y_val = model2.predict(test_data) 59 | print("prediction result") 60 | print(np.int_(y_val)) 61 | 62 | 63 | #cv2.imshow("Image", image) 64 | #cv2.waitKey(0) 65 | #cv2.destroyAllWindows() -------------------------------------------------------------------------------- /sample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shanlau/SVM_Recognizing_Digit/006f107e5203adf52b5978f5ad34cf89ae2817c2/sample.png -------------------------------------------------------------------------------- /svm_model.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import cv2 3 | import os 4 | import imutils 5 | import random 6 | 7 | root_dir = os.path.dirname(__file__) 8 | image_directory = root_dir+ '/image/' 9 | train_data = [] 10 | 11 | #get training data 12 | for filename in sorted(os.listdir(image_directory)): 13 | if filename.endswith(".png"): 14 | img = cv2.imread(image_directory + filename) 15 | img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 16 | img = imutils.resize(img, height=50,width=50) 17 | train_data.append(img) 18 | 19 | 20 | train_data = np.asarray(train_data, dtype=np.float32) 21 | print(train_data.shape) 22 | train_data = np.reshape(train_data,(20,2500)) 23 | print(train_data.shape) 24 | 25 | #mark training label 26 | train_label = np.array([0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9], dtype=int) 27 | 28 | 29 | #create SVM model 30 | model = cv2.ml.SVM_create() 31 | model.setType(cv2.ml.SVM_C_SVC) 32 | model.setKernel(cv2.ml.SVM_LINEAR) 33 | model.setTermCriteria((cv2.TERM_CRITERIA_COUNT, 100, 1.e-06)) 34 | model.train(train_data, cv2.ml.ROW_SAMPLE, train_label) 35 | 36 | #save model 37 | model.save("model.xml") 38 | 39 | 40 | #predict image 41 | test_data = [] 42 | filename = random.choice([x for x in os.listdir(image_directory) if os.path.isfile(os.path.join(image_directory, x))]) 43 | img = cv2.imread(image_directory + '/' + filename) 44 | img = imutils.resize(img, height=50,width=50) 45 | img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 46 | 47 | test_data.append(img) 48 | test_data = np.asarray(test_data, dtype=np.float32) 49 | test_data = np.reshape(test_data,(1,2500)) 50 | 51 | #load model 52 | model2 = cv2.ml.SVM_load("model.xml") 53 | _, y_val = model2.predict(test_data) 54 | print("prediction result") 55 | print(y_val) 56 | 57 | cv2.imshow("Image",img) 58 | cv2.waitKey(0) 59 | cv2.destroyAllWindows() 60 | --------------------------------------------------------------------------------