OpenCV簡(jiǎn)單標(biāo)準(zhǔn)數(shù)字識(shí)別的完整實(shí)例
在學(xué)習(xí)openCV時(shí),看到一個(gè)問答做數(shù)字識(shí)別,里面配有代碼,應(yīng)用到了openCV里面的ml包,很有學(xué)習(xí)價(jià)值。
https://stackoverflow.com/questions/9413216/simple-digit-recognition-ocr-in-opencv-python#
import sys import numpy as np import cv2 im = cv2.imread('t.png') im3 = im.copy() gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)#先轉(zhuǎn)換為灰度圖才能夠使用圖像閾值化 thresh = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2) #自適應(yīng)閾值化 ##################Now finding Contours################### # image,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE) #邊緣查找,找到數(shù)字框,但存在誤判 samples = np.empty((0,900)) #將每一個(gè)識(shí)別到的數(shù)字所有像素點(diǎn)作為特征,儲(chǔ)存到一個(gè)30*30的矩陣內(nèi) responses = []#label keys = [i for i in range(48,58)] #48-58為ASCII碼 count =0 for cnt in contours: if cv2.contourArea(cnt)>80: #使用邊緣面積過濾較小邊緣框 [x,y,w,h] = cv2.boundingRect(cnt) if h>25 and h < 30: #使用高過濾小框和大框 count+=1 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,(30,30)) 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,900)) samples = np.append(samples,sample,0) if count == 100: #過濾一下過多邊緣框,后期可能會(huì)嘗試極大抑制 break 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) # cv2.waitKey() cv2.destroyAllWindows()
訓(xùn)練數(shù)據(jù)為:
測(cè)試數(shù)據(jù)為:
使用openCV自帶的ML包,KNearest算法
import sys import cv2 import numpy as np #######training part ############### samples = np.loadtxt('generalsamples.data',np.float32) responses = np.loadtxt('generalresponses.data',np.float32) responses = responses.reshape((responses.size,1)) model = cv2.ml.KNearest_create() model.train(samples,cv2.ml.ROW_SAMPLE,responses) def getNum(path): im = cv2.imread(path) out = np.zeros(im.shape,np.uint8) gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) #預(yù)處理一下 for i in range(gray.__len__()): for j in range(gray[0].__len__()): if gray[i][j] == 0: gray[i][j] == 255 else: gray[i][j] == 0 thresh = cv2.adaptiveThreshold(gray,255,1,1,11,2) image,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE) count = 0 numbers = [] for cnt in contours: if cv2.contourArea(cnt)>80: [x,y,w,h] = cv2.boundingRect(cnt) if h>25: cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),2) roi = thresh[y:y+h,x:x+w] roismall = cv2.resize(roi,(30,30)) roismall = roismall.reshape((1,900)) roismall = np.float32(roismall) retval, results, neigh_resp, dists = model.findNearest(roismall, k = 1) string = str(int((results[0][0]))) numbers.append(int((results[0][0]))) cv2.putText(out,string,(x,y+h),0,1,(0,255,0)) count += 1 if count == 10: break return numbers numbers = getNum('1.png')
總結(jié)
到此這篇關(guān)于OpenCV簡(jiǎn)單標(biāo)準(zhǔn)數(shù)字識(shí)別的文章就介紹到這了,更多相關(guān)OpenCV標(biāo)準(zhǔn)數(shù)字識(shí)別內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。